ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

SDL

矩形の描画

SDL

中を塗りつぶさない矩形、つまり矩形の外枠部分の描画方法。 水平線、垂直線は矩形の幅や高さを1として描画してやればよい。 typedef struct { int left; int top; int right; int bottom; } RECT; SDL_Surface* pSurface; void drawRect(RECT& rect, int r,…

ドットを描画

SDL

SDLで1ドットを描画するには、矩形領域を塗りつぶす関数で幅1高さ1の矩形を描画すればよい。 ドットを描画する関数は次の通り。 SDL_Surface* pSurface; void drawPoint(int x, int y, int r, int g, int b, int a) { SDL_Rect rect; rect.x = x; rect.y = y…

ライン描画

ステージやキャラクターのグラフィックはまだ用意していないので、とりあえずラインで描画しておこうと思ったが、SDLには矩形描画はあるがライン描画はなかった。斜めのラインを書きたかったら自分で斜めのピクセル座標を計算しなくてはならないようだ。いわ…

SDL.NET

オープンソースのライブラリ「SDL.NET」で始める ゲームプログラミング ~前編~ (1/3):CodeZine(コードジン) オープンソースのライブラリ「SDL.NET」で始める ゲームプログラミング ~後編~ (1/3):CodeZine(コードジン) SDLに.NET版があったのを初め…

描画のクリアその2

SDLにはサーフェスをクリアする命令がないと思っていたけど、SDL_FillRectという指定したカラーで矩形を塗りつぶすという命令があった。それで画面のクリアを実現できる。 わざわざクリア用のテクスチャを用意する必要はなかった。 ということでクリアカラー…

ライン描画

デバッグでコリジョンをチェックするためにラインを描画しようと思ったら、SDLにライン描画の関数が見当たらない。どうやらライン描画をする関数はないようだ。しかし、矩形を指定した色で塗りつぶす関数SDL_FillRectがあったので、これでラインを描画するこ…

描画順

SDL

そういえば、描画の指定にZの値が無かった。ということは一番奥のものから描画していかないといけないということ。 自前のライブラリではZの指定をできるようにして、Zの順に描画登録をするようにしよう。

描画のクリア

テクスチャの描画処理を行わなければ、てっきり描画されなくなるものと思いこんでしまっていた。DirectXの場合、クリアカラーを設定して毎フレーム最初にクリアされるが、SDLの場合、サーフェスに転送したイメージはそのまま。そういえばクリアする設定が見…

半透明の描画

半透明がうまくいかなかった原因はサーフェスを表示フォーマットに変換する処理でSDL_DisplayFormatAlpha()を使わずにSDL_DisplayFormat()を使っていたからだった。 そりゃアルファチャンネルあっても半透明で描画できるわけがない。 これが原因だと分かるま…

ジョイスティックその6

SDL

ジョイスティックの状態を取得する方法として、イベントを使う方法もある。 まず、SDL_JoystickEventStateでジョイスティックのイベントを有効にして、イベントを受け取るジョイスティックをオープンする。 SDL_Joystick *joystick; SDL_JoystickEventState(…

ジョイスティックその5

SDL

ジョイスティックを引っ張り出してきて、今のPCで使えるようにセットアップ。 SDL_JoystickName()で得られるジョイスティック名はコントロールパネルのゲームコントローラで表示されるものと同じだった。 またSDL_JoystickGetAxis()で得られる値は、ジョイス…

ジョイスティックその4

SDL

ジョイスティックの状態の調べ方。ジョイスティックイベントで調べる方法もあるけど、今回は手動の方法。 まずは、SDL_JoystickUpdateでジョイスティックの状態を更新。 void SDL_JoystickUpdate(void); 軸の状態を調べるにはSDL_JoystickGetAxis。 Sint16 S…

ジョイスティックその3

SDL

ジョイスティックを使うにはまずオープンする必要がある。オープンする関数はSDL_JoystickOpen()。 SDL_Joystick *SDL_JoystickOpen(int index); 戻り値はSDL_Joystick構造体。オープンに失敗したときはNULLとなる。 使い終わったあとにはクローズする必要が…

ジョイスティックその2

SDL

ジョイスティックが接続されているか判定するにはSDL_NumJoysticks()を使う。この関数で接続しているジョイスティックの数が取得できる。 int SDL_NumJoysticks(void); さらに、SDL_JoystickName()で割り当てられたジョイスティックの名前を取得することがで…

ジョイスティックその1

SDL

SDLでジョイスティックを使用するにはまずジョイスティックのサブシステムを初期化しなくてはならない。初期化はSDL_Init()の引数にSDL_INIT_JOYSTICKを指定して行う。 if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 ) { fprintf(std…

イベントの取得

SDL

キーが押されたとか、マウスが動かされたなどのいわゆるイベントを取得するにはSDL_PollEvent()を使う。 int SDL_PollEvent(SDL_Event *event); 実際の使い方は次の通り。 SDL_Event event; while ( SDL_PollEvent(&event) ) { switch( event.type ) { case …

キー判定

SDL

SDLでキーボードの入力判定を行うにはSDL_GetKeyState()を使う。 Uint8 *SDL_GetKeyState(int *numkeys); この関数はキーボードの状態を格納した配列へのポインタを返し、その配列のサイズがnumkeysに格納される。配列の値が1のときキーが押されていて、0の…

フレーム待ち

SDL

SDL_Delay()を使って指定した時間待つことができる。 void SDL_Delay(Uint32 ms); 引数にはミリ秒を指定。ただ場合によっては遅延があることもある。 サンプルではこれとSDL_GetTicks()を使ってフレーム待ちを実装している。それは次の通り。 #define FRAMES…

ミリ秒の取得

SDL

プログラム中で経過時間を知りたい場合はSDL_GetTicks()を使う。 Uint32 SDL_GetTicks(void); この関数はSDLのライブラリの初期化からの経過ミリ秒を取得する。uint32の値を返すので49日以上経過すると0に戻ってしまう。 が、49日も続けてプレイするようなゲ…

SDL_LowerBlit

SDL

サンプルプログラムにSDL_LowerBlit()という関数があるのだが、ドキュメントにはその項目が見つからない。名前から低レベルの転送を行うものだと思うんだけど。

画像の描画

SDL

SDL_BlitSurface()でスクリーンに転送したのち、SDL_UpdateRect()で画面の更新を行う。 int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect); srcが転送元のサーフェース。srcrectが転送元の位置、サイズ。NULL…

画像の表示フォーマットへの変換

SDL

SDL_DisplayFormat()でロードした画像を高速転送に対応するように変換する。 SDL_Surface *image, *surface; image = IMG_Load("test.gif"); surface = SDL_DisplayFormat(image); 高速に表示させるためにビデオのフレームバッファに合わせた変換を行うとい…

画像の透明部分

SDL

読み込んだ画像の一部分を透明にするには、SDL_SetColorKey()で設定する。 int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key); surfaceは設定する画像、flagにフラグ。keyに透明にするピクセルの値を入れる。 フラグにはSDL_SRCCOLORKEY…

画像の読み込み

SDL

画像をファイルから読み込むにはIMG_Loadを使う。戻り値はSDL_Surfaceへのポインタ。 SDL_Surface* IMG_Load(const char *file); ヘッダファイルのコメントを見ると対応フォーマットはBMP,GIF,PNG。そのほかもあるようだがそれは分からない。でもこの3種類に…

サウンドの再生その2

SDL

サウンドの一時停止はMix_Pause(),一時停止したのを再開するのはMix_Resume(),停止するのはMix_HaltChannel()。これらの関数の引数はチャネル番号。-1を指定した場合はすべてのチャネル。 // 一時停止 Mix_Pause(-1); // 再開 Mix_Resume(-1); // 停止 Mix_H…

サウンドの再生

SDL

効果音などのサウンドの再生にはMix_Chunkを使う。 まずMix_LoadWAV()でWAVファイルを読み込んでMix_Chunkを作成する。 Mix_Chunk* pSound; pSound = Mix_LoadWAV("sound.wav"); 再生するときはMix_PlayChannel()を使う。 int Mix_PlayChannel(channel,chunk…

ミュージックの再生

SDL

ゲームのBGMとして音楽の再生にはMix_Musicを使う。 まずはデータの読み込み。 Mix_Music *music; music = Mix_LoadMUS("music.it"); ここでの拡張子itのファイルはMODで使われるサウンドデータファイル。このほかにもMIDIファイルを扱うことができる。 再生…

グラフィックの初期化

SDL

グラフィックデバイスの初期化はSDL_SetVideoMode()。ヘッダでの定義は次の通り。 extern DECLSPEC SDL_Surface * SDLCALL SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags); widthは幅、heightは高さ。bppはピクセル深度。0の場合は現在表…

オーディオの初期化

SDL

オーディオデバイスの初期化にはMix_OpenAudio()を使う。ヘッダでの定義は次の通り。 /* Open the mixer with a certain audio format */ extern DECLSPEC int SDLCALL Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize); frequenc…

エラーの原因を知る

SDL

SDLの関数でエラーが返ってきたとき、そのエラー情報をSDL_GetError関数を使って文字列で取得できる。 使うときは次のような感じ。 if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 ) { fprintf( stderr, "Couldn't initialize SDL: %s\n", SDL_GetError(…