ゲーム作成講座 on Linux(&Windows)

対象者

ゲームを今まで作ったこともなくて、作りかたが想像もつかない方、根性がある 方

ゲームライブラリおよび製作環境

この講座では、ライブラリとして SDL を用います。
このライブラリは、特徴としてWindowsおよびUNIX互換のOSで動くマルチメディ アライブラリです。 ただ、ライセンスがLGPLであるので、ソースコードなどが 基本的にオープンソースでなければならないです。(詳しいことは、googleなど でLGPLなどと検索して、LGPLの翻訳文章を読んでみてください) などを読んでみてください)。
使用する言語は、C言語です。Windowsの環境の方 (多くの方がこれに該当するでしょう)は環境としてVisual C++を対象とします。 UNIXの方は、GCC(+make)を対象とします。
なお、著者はGCCで開発を行っていますので、基本的に、UNIXよりの解説になり ます。

SDLのインストールの方法を、以下の様に簡単に示しますが ここ のサイトなどを参考にしてもよいと思います。

UNIX系の方のインストール方法

(UNIX系の方は、最初からインストールされている可能性が高いのでやらなくて もよいかもしれません。Linuxの方はほぼ入っているでしょう)

1

ブラウザなどから SDL にアクセスしDevelopment Libraries から、開発用ライブラリ(名前が SDL-devel-バージョンとなっているもの)の最新版を落とす。

2

rpmをインストールする方
rpm -Uvh ファイル
ソースコードからインストールされる方
tar xzvf ファイル名
解凍してできたディレクトリに移動して
./configure
make
make install(rootで)
とすればインストールできます。

Windows環境の方

上記1のサイトから SDL-devel-1.2.7-VC6.zip (Visual C++ 5,6,7)
SDL-devel-1.2.7-mingw32.tar.gz (Mingw32)
のそれぞれ環境にあったものを落とし、そのドキュメントを読んで下さい。
英語ですが、難しい文章ではないので読めると思います。

ハローワールド

それでは実際にコーディングに入ってみましょう。 簡単なプログラムとして有名なハローワールドです。

#include "SDL.h"   /* 全てのSDLアプリケーションで必要です */
#include 

int main() {
    
    printf("SDLの初期化をしています。\n");
    
    /* ビデオとオーディオ、それからデフォルトのサブシステムを初期化 */
    if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) { 
        printf("SDLの初期化ができませんでした: %s.\n", SDL_GetError());
        exit(-1);
    }

    printf("SDLの初期化が完了しました。\n");

    printf("SDLを終了しています。\n");
    
    /* 全てのサブシステムをシャットダウンします */
    SDL_Quit();
    
    printf("終了します....\n");

    exit(0);
}

コンパイルの方法は
$ gcc hello.c `sdl-config --libs --cflags`
とすればよいです。
VCの方は、インストールさえできていれば、問題無くコンパイルできるはずです。

実際のコーディング

実際のゲームプログラムは以下のような形になっています

メイン関数で

初期化の処理
while(1){
 画面の消去
 イベントの処理(ボタンが押されたなど)
 毎秒の更新処理
 描画や、音を再生
 時間をつぶす(sleepなどで)
}
このような形になっています。 これで、自発的な活動をするプログラムを作成することができます。
例えば、上の例で、更新処理のところに敵の座標に+1などとすると、人間の目に は敵が移動して見えるはずです。

描画の方法

ここではBMPフォーマットのデータを表示する方法を示します。

/***************************************************

ビットマップを読み、引数のサーフェスに設定する

*************************************************/
int set_surface_bmp(char *file, SDL_Surface **bmp){

  SDL_Surface *surface;
  surface = SDL_LoadBMP(file);
    if(surface == NULL) {
        printf("Can't read file: %s\n", SDL_GetError());
        return 1;
    }

    if(SDL_SetColorKey(surface, SDL_SRCCOLORKEY, SDL_MapRGB(surface->format,255, 0, 0)) < 0)
      {
                printf("Can't to set color key  : %s\n", SDL_GetError());
                return 1;
      }

         *bmp = SDL_DisplayFormat(surface);
    if(bmp == NULL) {
        printf("can't encoded surface: %s\n", SDL_GetError());
        return 1;
    }

    SDL_FreeSurface(surface);
    return 0;
}


このような関数を宣言しておき、以下の様にすることでSDLでは 画面にビットマップを表示することができます。

SDL_Surface *bmp1;
set_surface_bmp("input.bmp",&bmp1);
SDL_BlitSurface(bmp1,NULL,screen,NULL);
SDL_BlitSurfaceの引数はマニュアルでしらべてみるとよいでしょう。
日本語のマニュアルは ここ にあるので、一通り読むと勉強になるはずです。

イベントの処理


/*******************************************************

メインのイベント処理関数

********************************************************/
void TranscateEvent(SDL_Event * event){
  while( SDL_PollEvent( event ) ){
       switch( event->type ){

        case SDL_VIDEOEXPOSE:
                        SDL_Flip(screen);
                        break;

        case SDL_QUIT:
                    printf("アプリケーションを終了します\n");
                        exit(0);
                    break;
/* キーが押されたかどうかチェック */
    case SDL_KEYDOWN:
                event_keydown_transcate(event);
            break;
        case SDL_KEYUP:
                event_keyup_transcate(event);

                break;
           }
  }
}
このような関数を宣言し、イベントを処理します。
この関数に関しては、前章で述べたマニュアルを参照したほうが わかりやすい文章がかかれているので、そちらもぜひ読んでみて下さい

ゲーム作成

実はもう、ゲームを作成するには十分な関数がそろっていたりします。

 while(1){
 
 //イベントの処理
 TranscateEvent(&event);
 
 //画面のクリア
 SDL_FillRect(screen,NULL,SDL_MapRGB(screen->format,0,0,255));

 //背景の描画
 SDL_BlitSurface(background2,NULL,screen,NULL);
 SDL_BlitSurface(background,&TEST2,screen,&TEST);

 
 
 //ボールの描画
 DrawBallSurf(sBall,sPlayer);

 
 //自機の描画
 DrawPlayerSurf(sPlayer);
 
 
 ////壁の描画
 DrawWallSurf();
 
 //画面更新
 SDL_Flip(screen);
 
 
 SDL_Delay(16);
 
 }
 
これは、ブロック崩しのメインのループですが、描画のところをてきとうに補間 してやれば、すでにゲームプログラムとして、十分でしょう。

まとめ

最近では、このように、ゲームプログラムの作成は非常に簡単になってきていま す。先人たちの方が、素晴しいライブラリ郡を開発してくれたおかげです。 いい時代になったものですね。
最後に、今後のためにお薦めの本をいくつか紹介して終わりたいと思います
なお、これらの本を勧める理由は、ゲームプログラムに役に立つのではなくて プログラマとして勉強しておいた方がいいから勧めている本の類です。 よって、ゲームをつくるためだけで、プログラムを勉強したい方にはいまいちお 薦めできません

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI ISBN: 4894712059

コンピュータでネットワークプログラミングをする方には必読ともいえるような 本です。ゲームを作成する上で今後ネットワークはきっても切れない縁ですので 勉強しておいて損はないでしょう


コンピュータの構成と設計(上巻) ISBN: 482228056X
コンピュータの構成と設計 (下巻) ISBN: 4822280578

この本は、いわゆるヘネパタ本の翻訳本です。コンピュータアーキテクチャの基 礎が学べます。コンピュータの中身を見てみたいひと向けです。

UNIXプログラミング環境 ISBN: 4871483517

この本は、はっきりいって、ゲームプログラミングにはかけらも役に立たないで しょう。ですが、この本の内容自体は素晴らしく、どのようにプログラムは作る べきかというような考え方を身に着けることができるのでおすすめしてみました。 ただ、非常に入手困難らしいので、見付けたらすぐかわないと二度と手に入らな いかもしれません

C言語による最新アルゴリズム事典 ISBN: 4874084141

この本は、アルゴリズムの本というより、なんとなく眺めて面白いことが書いて あったら使ってみるというような感じで使う本だと思います。 索引も付いていて、クイックソートしたいときとかには探してソースコードを見 ると言ったような使いかたがお薦めです。面白い、アルゴリズムも載っていたり するので、ゲームのプログラムにもきっと参考になるでしょう。

定本Cプログラマのためのアルゴリズムとデータ構造 ISBN: 4797304952

この本は、普通にアルゴリズムとデータ構造を勉強できる本です。

シューティングゲームアルゴリズムマニアックス ISBN: 4797327316

お薦めの本の中で唯一ゲームプログラミングの本です。この本はシューティング ゲームのアルゴリズムが大量に載っていて、それをいかに実装すればよいかが詳しく 書かれており、実におもしろい本です。初心者にも十分勧めることができる本で す。

著者: さくらんぼ