D + SDL 入り口に立ってみた

唐突になにか作りたくなったのですが、「コレが作りたい!」っていうものはありません。
で、特に理由もなくD言語で3Dをやろうと思いつきました。

D言語は「ぼくのかんがえたさいきょうげんご」に最も近い言語なので好きなのですが、仕事で使うこともないので詳しくはないです。
3Dプログラムもさっぱりです。DXライブラリでMMDモデル読み込んで遊んだことがある程度。Seleneでもちょっと遊んだか。

で、最初DirectX使おうと思ってググってみて、すぐヒットした傾き指向プログラミングさんのD言語用DirectXモジュールを使おうとしたけど、サンプルのテトリスがどうにもビルドできなくてあっさり挫折。
dmdのバージョンが不味いのかなぁ。2.064.2なんだけど。
まぁこっちはまたいずれチャレンジするとして。

仕事としてAndroidが視野に入ってきたので、そっちで役立てられる可能性があるOpenGLを覚えよう!と思い立ち、まずSDLをやることにしました。

以下、環境設定その他の健忘録

まずはビルドに必要なモノを揃える

DMDをD言語本家から。現時点での最新バージョンは2.064.2。
DLしたら適当な場所に解凍しておく。

SDL.dllをSDL本家から。SDL1.2のRuntime LibrariesからSDL.dllを入手。
Development Librariesのほうはlibも入ってるけど、このlibはなぜか使えない(Not a Valid Library Fileって怒られる)ので使わない。

SDLのD用ポーティングモジュールを傾き指向プログラミングさんから。
DLしたら適当な場所に解凍しておく。
これにsdl.libとかも同梱されているので、こっちを使う。

コマンドラインは怠いのでVisual Dを使います。
Visual Dのインストールは上記リンク通りにやればOK.
うちはVisualStudio2010なので、以下ソレ用に書きます。

で、早速作り始める。

1.VisualStudioを起動して、[新しいプロジェクト]→テンプレートから[D]の[Windows Application]を選択して、ソリューション名等を決定する。

2.プロジェクトのプロパティで[構成プロパティ]→[Compiler]のAdditional Importsに、解凍したSDLポーティングモジュールの中のmodulesフォルダのパスを設定

3.プロジェクトのプロパティの[Linker]のLibrary Search PathにSDLポーティングモジュールの中のwindows\libフォルダのパスを設定。

4.[Linker]のLibrary Filesに、使用するlibを追加する。今回はSDL.libとopengl32.lib。

コードを書く。

下記コードは傾き指向プログラミングさんとこから丸パクリ。
ありがたやありがたや

module winmain;

import core.runtime;
import core.sys.windows.windows;
import org.libsdl.sdl;
import org.opengl.gl;

extern (Windows)
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    int result;

    void exceptionHandler(Throwable e)
    {
        throw e;
    }

    try
    {
        Runtime.initialize(&exceptionHandler);

        result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

        Runtime.terminate(&exceptionHandler);
    }
    catch (Throwable o)		// catch any uncaught exceptions
    {
        MessageBoxA(null, cast(char *)o.toString(), "Error", MB_OK | MB_ICONEXCLAMATION);
        result = 0;		// failed
    }

    return result;
}
immutable int SCREEN_WIDTH = 640;
immutable int SCREEN_HEIGHT = 480;

int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    /* ... insert user code here ... */
    //throw new Exception("not implemented");

	if (SDL_Init(SDL_INIT_VIDEO) < 0)
		throw new Error("SDL_Init failed.");
	scope(exit) SDL_Quit();

	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
	SDL_Surface* screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_OPENGL);
	if (screen is null)
		throw new Error("SDL_SetVideoMode failed.");

	glClearColor(0.0f, 0.5f, 0.0f, 0.0f);

	glOrtho(0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, -1.0, 1.0);

	for (;;)
	{
		SDL_Event event;
		while (SDL_PollEvent(&event))
		{
			if (event.type == SDL_QUIT)
				return 0;
		}
		glClear(GL_COLOR_BUFFER_BIT);
		glBegin(GL_TRIANGLES);
		glColor3f(1.0f, 0.5f, 1.0f);

		glVertex3f(100.0f, 100.0f, 0);
		glVertex3f(600.0f, 300.0f, 0);
		glVertex3f(50.0f, 400.0f, 0);

		glEnd();

		SDL_GL_SwapBuffers();
	}

    return 0;
}

VSから実行する場合、ソースのある場所にSDL.dllを置くこと。
直接実行する場合は、実行ファイルと同じフォルダにSDL.dllを置く。

追記
上記ソースはDMD2.064.2だと24行目でコンパイルエラー(警告?)が出る。実行は可能。
一つ前の2.063.2だと出ないんだけど。
つかVisualDが生成するスケルトンコードなんだけどな。うーん。


さて、ここからだよなぁ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

認証のために問題を解いて下さい * Time limit is exhausted. Please reload CAPTCHA.