第一章「SDLの基本的な使い方」第十三話(最終話)


第一章は、もしかすると今回で最後かもしれません。(自信なさげ。。。)

というのは、ここからは、実際に何か作ってみないと、どんな機能が必要なのか思いつかないのです。
ですから、次回からは実際に作りながら、新しい機能が必要になったらそのとき解説して行こうと思います。

では、第一章最後のお題。

SDL_GetKeyState();


この関数の使い方は少し複雑です。まず、実際の使い方。

Uint8 *keys=SDL_GetKeyState(NULL);
if( keys[SDLK_UP] ) printf("↑が押されています。");

Uint8で定義されたポインタのkeysに、SDL_GetKeyState(NULL);を代入。
(Uint8とは、unsign系intの8ビット=0〜255)
この時点で、keysは、たくさんの配列を持ちます。(数えてませんが、おそらく256個あるのかな。。)

それぞれの配列には、キーボードの各キーが割り当てられ、そのキーが押されているなら1を、押されてないのなら0を持ちます。

配列の名前は、ここに書くと長くなるので、とりあえず、ここのリファレンスを見てください。
http://www.tacoworks.jp/software/SDLdoc-jp/html/sdlkey.html

あとはメインループの中で、この関数を使って定期的に調査させれば、リアルタイムでキーの状態がわかるようになりますね。

では、ソースに加えてみます。
Anime()のところをいじって、キーが押されていたら絵を変えるように作り変えてみましょう。

#include <stdio.h> #include "SDL/SDL.h" #include "SDL/SDL_image.h" #pragma comment(lib, "SDL.lib") #pragma comment(lib, "SDLmain.lib") #pragma comment(lib, "SDL_image.lib") bool Init(void); //初期処理 bool Event(void); //イベント処理 void End(void); //終了処理 void Anime(void); //アニメ処理用 SDL_Surface *screen; SDL_Surface *img1; SDL_Surface *img2; int main(int argc, char* argv[]) { if(!Init()) //初期化&確認 { printf("初期化に失敗しました"); return 0; } img1 = IMG_Load("sample1.png"); img2 = IMG_Load("sample2.png"); while(1) //メインループ { Anime(); //アニメ処理へ SDL_Flip(screen); if(!Event()) break; //イベント確認 SDL_Delay(60); //休憩。(アニメの動作が遅ければ、ここの数字を減らす) } SDL_FreeSurface(screen); //SDL_Surface型変数の中身を消去する。 SDL_FreeSurface(img1); SDL_FreeSurface(img2); End(); //終了処理へ return 0; } void Anime() { SDL_Rect rect; rect.x=0;rect.y=0; rect.w=640;rect.h=480; Uint8 *keys=SDL_GetKeyState(NULL); if(keys[SDLK_UP]) { SDL_BlitSurface(img1,NULL,screen,&rect); //UPキーが押されていたらimg1をscreenに転送 }else{ SDL_BlitSurface(img2,NULL,screen,&rect); //UPキーが押されていなければimg2をscreenに転送 } } ・・・以下省略・・・





〜〜第14話(特別編)へ〜〜