11.30.2009

思い立ったらすぐやってみる派。

Objective-CでWindowsアプリな回で予想したとおり、SDL試してみました。

MinGW向けのSDLライブラリを、公式サイトからゲット。

で、ここを参考にコードを書く。
しばらく触ってなかったせいか、SDLの流儀的なものをすっかり忘れている。
チュートリアルサイトのコードがないと書けないとか、一時期SDLに取り組んでたとは思えない低能っぷり。実に恥ずかしいな。

#import <SDL/SDL.h>
#import <stdio.h>
#import <objc/Object.h>

#define SCR_WIDTH 640
#define SCR_HEIGHT 480
#define SCR_BPP 32
#define CAPTION "SDL Hello"

SDL_Surface *gScreen;

@interface Game : Object
- (BOOL)Initialize;
- (void)End;
- (BOOL)PollEvent;
@end

@implementation Game
-(BOOL) Initialize {
if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) return NO;

SDL_WM_SetCaption( CAPTION, NULL );
gScreen = SDL_SetVideoMode(
SCR_WIDTH,
SCR_HEIGHT,
SCR_BPP,
SDL_SWSURFACE);

SDL_ShowCursor( SDL_DISABLE );
return YES;
}

-(void) End {
SDL_Quit();
}

-(BOOL) PollEvent {
SDL_Event ev;
SDLKey *key;

while(SDL_PollEvent(&ev)) {
switch(ev.type) {
case SDL_QUIT:
return NO;
break;
case SDL_KEYDOWN: {
key = &(ev.key.keysym.sym);
if( *key == 22 ) {
return NO;
}
}
break;
}
}
return YES;
}
@end

int main(int argc, char* argv[])
{
id G = [Game new];

if( ![G Initialize] ) {
printf("Initialized fail.\n");
[G free];
return 1;
}

while( 1 ) {
if( ![G PollEvent] ) break;
}

[G End];
[Game free];
return 0;
}


全然Objective-Cっぽくないという。
まぁ、Objective-Cの機能を使ったコードが通るってことを実証したかったわけで。

最初、BOOL型をboolとして怒られ、YESをtrueやTRUEとして怒られ、NOをfalseやFALSEとして怒られた。
文化の違いってやつだと思う。Booleanなのに、真偽じゃなく、YES/NOって……。
(どうでもいいけど、Accessだったっけか?YES/NO型ってのがあるの。)

ともかく、ざっくりと上記のようなコードを書き上げて、

gcc [filename] -lobjc -lmingw32 -lSDLmain -lSDL -mwindows

とかしてコンパイルしてやる。
もちろん、手元では-lobjcじゃ通らないから、直接ライブラリファイルを指定してるわけだけど、パスを書くのが面倒だから、ここでは-lobjcで代用しとく。

当然?とでも言うかのように、エラーも警告無くコンパイルが通って、exeファイルが生成される。
必要なDLLがそろってるディレクトリに移動させて、起動してやると、図のようなウィンドウが出た。



うん。OKなんじゃない?
もっとうまく、オブジェクト指向なコーディングが出来れば、なお使いやすそう。
お遊びに使うには十分すぎる性能を持っていると言えるカモね。

0 件のコメント: