mieki256's diary



2018/03/11() [n年前の日記]

#1 [windows][mruby] Visual Studio 2015上でSDL2を使った何かをビルド

Windows10 x64 上で、mruby + SDL2 を動かしてみたいのだけど。その前に、Visual Studio 上で SDL2 を使った何かしらをビルドできる状態にしておかないといかんのだろうと想像するわけで。

ということで、Windows10 x64 + Visual Studio 2015 Community で、SDL2 を使った何かをビルドできそうかどうか実験。

SDL2関係のファイルを入手 :

Visual Studio で SDL2 を利用するなら、以下のファイルが必要らしい。
  • SDL2-devel-2.0.8-VC.zip (Visual C++ 32/64-bit)
  • SDL2_image-devel-2.0.3-VC.zip (Visual C++ 32/64-bit)
  • SDL2_mixer-devel-2.0.2-VC.zip (Visual C++ 32/64-bit)
  • SDL2_ttf-devel-2.0.14-VC.zip (Visual C++ 32/64-bit)
  • SDL2_net-devel-2.0.1-VC.zip (Visual C++ 32/64-bit)

以下から入手する。

_Simple DirectMedia Layer - SDL version 2.0.8 (stable)
_SDL_image 2.0
_SDL_mixer 2.0
_SDL_ttf 2.0
_SDL_net 2.0

一々ページを開いてDLするのが面倒なら、以下のリストを使って…。

_urls.txt
https://www.libsdl.org/release/SDL2-devel-2.0.8-VC.zip
https://www.libsdl.org/projects/SDL_image/release/SDL2_image-devel-2.0.3-VC.zip
https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-2.0.2-VC.zip
https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-2.0.14-VC.zip
https://www.libsdl.org/projects/SDL_net/release/SDL2_net-devel-2.0.1-VC.zip

wget にURLリストファイルを渡して、一気にDLする、とか。
wget --no-check-certificate -i urls.txt
wget を使ってhttpsサーバにアクセスさせる時は、wget --no-check-certificate をつけるといいらしい。

_wgetでこういう時はこうする!! - Qiita

zip群をDLできたら、解凍する。今回は D:\sdl2\dev\vc\ 以下にコピーした。includeフォルダ内に *.h を、libフォルダ内に *.lib と *.dll をまとめておく。lib は、x86 と x64 (32bit版と64bit版)があるので、今回は x86 版を使って作業した。

VS2015でプロジェクトを作成。 :

ファイル → 新規作成 → プロジェクト → Visual C++ → Win32 → Win32コンソールアプリケーション。

Win32アプリケーションウイザードが開くので、空のプロジェクト、にのみチェックを入れて、プロジェクトを新規作成。

ソリューションエクスプローラーで、ソースファイルを右クリック → 追加 → 新しい項目 → main.cpp を追加。

main.cpp の内容は以下にする。ウインドウを開いて2秒経ったら閉じる、という処理らしい。

_開発環境 Linux | ゲーム作ろう
#include <SDL.h>
 
int main(int argc, char *argv[])
{
    SDL_Window* win = NULL;
 
    if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 )
    {
        return 1;
    }
 
    win = SDL_CreateWindow("hello",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            640, 480,
            SDL_WINDOW_RESIZABLE);
 
    if( ! win )
    {
        return 1;
    }
 
    SDL_Delay(2000);
 
    SDL_DestroyWindow( win );
    SDL_Quit();
 
    return 0;
}

プロジェクトのプロパティを設定。 :

プロジェクト → プロパティ。構成を「すべての構成」に。
  • VC++ディレクトリ → インクルードディレクトリに、SDL2 の includeフォルダを追加。
  • VC++ディレクトリ → ライブラリディレクトリに、SDL2 の lib でディレクトリを追加。

リンカー → 入力 → 追加の依存ファイル → 以下を追加。
SDL2main.lib
SDL2.lib

リンカー → システム → サブシステム → Windows(/SUBSYTEM:WINDOWS) に変更。

C/C++ → コード生成 → ランタイムライブラリ → /MT に変更。これで静的リンクがされるらしい。が、このへんよく分かってない。メモリリークがどうのこうのという話もあるらしいけど…。

ビルドしてみる。 :

ビルド → ソリューションのビルド。正常終了と表示されたらいいな。

F5キーを押して実行。

「SDL2.dll が見つからないため、コードの実行を続行できません。」とエラーメッセージが表示された。

DL・解凍した、SDL2 の libディレクトリ内に、*.dll がたくさん入っているので…。プロジェクトの保存ディレクトリ内の、DebugディレクトリやReleaseディレクトリの中に、*.dll をごっそりコピーする。

再度 F5キーを押して実行。今度はウインドウが表示された。

ということで、Visual Studio 上でビルドはできる、ようではあるなと…。

画像を表示したい。 :

せっかくだから画像を表示してみたい。main.cpp を以下の内容にして、(Debug|Release)ディレクトリに sample.bmp や sample.png を置いて実験。
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
// #include <stdio.h>
// #include <string>
#include <iostream>
// #include <fstream>


int main(int argc, char *argv[])
{
    SDL_Window* win = NULL;
    SDL_Renderer *renderer;
    SDL_Surface *image;
    SDL_Texture *tex;
    SDL_Event ev;


    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        return 1;
    }

    win = SDL_CreateWindow("hello",
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        640, 480,
        SDL_WINDOW_RESIZABLE);

    if (!win)
    {
        return 1;
    }

    renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);

    IMG_Init(IMG_INIT_PNG);

    image = IMG_Load("sample.png");
    // image = SDL_LoadBMP("sample.bmp");
    if (image == NULL)
    {
        return 1;
    }

    tex = SDL_CreateTextureFromSurface(renderer, image);
    SDL_FreeSurface(image);

    while (true) {

        SDL_SetRenderDrawColor(renderer, 32, 160, 64, 255);
        SDL_RenderClear(renderer);

        if (SDL_PollEvent(&ev)) {
            if (ev.type == SDL_QUIT) {
                break;
            }
        }

        SDL_RenderCopy(renderer, tex, NULL, NULL);
        SDL_RenderPresent(renderer);
        SDL_Delay(10);
    }

    IMG_Quit();
    SDL_DestroyTexture(tex);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(win);
    SDL_Quit();

    return 0;
}

Visual Studio 上で F5キーを叩いてみたけど、画像が表示されない…。(Debug|Release)ディレクトリ内に出来上がった .exe を実行すると、画像が表示されるのだけど…。

Visual Studio の作業ディレクトリ設定を変更しないといけないらしい。デフォルトでは、プロジェクトディレクトリが作業ディレクトリになっているので、プロジェクト → 〜のプロパティ → デバッグ → 作業ディレクトリ → 「参照」を選んで、Releaseディレクトリ、もしくは、Debugディレクトリを選択してやることで、任意の作業ディレクトリを設定することができる。

これで、Visual Studio 上で F5キーを叩いた時も、画像が表示されるようになった。

vs2015_sdl2_ss01.png

文字列の出力ができない。 :

処理が失敗した時に何かメッセージを出力するようにしてみたかったのだけど、やり方が分からない…。

#include <iostream> をして、std::cout << "hoge" << std::endl; で出力できたりしないのかな…。それとも、#include <stdio.h> を書いて、printf("hoge"); とか。でも、どこにも文字列が出力されてないような。

参考ページ。 :


以上、1 日分です。

過去ログ表示

Prev - 2018/03 -
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project