挫折不可能!初級ゲームプログラミング完全マニュアル  RSSを登録する

「ゲームが作りたいけどプログラミングなんて全然知らない」「文系だし数学や物理が苦手だけどゲームが作れるだろうか?」そんなアナタのためのメールマガジンです。PCの電源を入れてからどうすればいいのか?から自分のゲームが完成するまでを応援します!

最新号をメルマガでお届けします    
登録 解除

規約に同意して

登録した方には、まぐまぐの公式メルマガ(無料)をお届けします。
2008/10/05

初級ゲームプログラミング完全マニュアル [vol.0066 2008/10/05]

┏┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳┓
┣┛                                                              ┗┫
┃       挫折不可能!  初級ゲームプログラミング完全マニュアル       ┃
┃                                                                  ┃
┃                       第 66 号  2008/10/05                       ┃
┣┓                                                              ┏┫
┗┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻┛
                            - Ads space -
┌┬───────────────────────────────┬┐
││ はじめに                                                     ││
└┴───────────────────────────────┴┘

 みなさま、こんにちは!

 個人ゲーム制作アドバイザーの Byerkut です!

 現在、超多忙スケジュールの中を縫ってメルマガを書いております。

 秘密のゲームプログラミング講座をお待ちの皆様、

 本当に申し訳ありませんが、今しばらくお待ちください。

 さて、今回はあのポインタが登場します!

┌┬───────────────────────────────┬┐
││本日のラインナップ                                            ││
└┴───────────────────────────────┴┘

  ・今日のメインテーマ
      【変数に入るものは数値文字列のみにあらず】

  ・あとがき

┌┬───────────────────────────────┬┐
││ みんなの備忘録                                               ││
└┴───────────────────────────────┴┘

  ■Visual C++ 2008 Express Edition をインストールする手順
    http://www.game-create.com/archives/235

  ■Visual C++ 2008 Express Edition でプロジェクトを新規作成する手順
    http://www.game-create.com/archives/270

  ■VC++ 2005 EE でプロジェクトにソースファイルを登録する手順
    http://blog.mag2.com/m/log/0000240151/108824854.html

  ■画像ファイルを LoadImage() 関数で読み込めるようにする手順
    http://www.game-create.com/archives/308

  ■ゲーム用ウィンドウのテンプレート
    http://www.game-create.com/menu/downloads

  ■ビットマップ学習用クラス - Study::Bitmap
    http://www.game-create.com/menu/downloads

┏┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳┓
┃┃                                                              ┃┃
┃┃                      今日のメインテーマ                      ┃┃
┃┃                                                              ┃┃
┃┃          【変数に入るものは数値文字列のみにあらず】          ┃┃
┃┃                                                              ┃┃
┗┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻┛

 なかなか仕事が忙しくなって参りましたので、ゲームプログラミングも

 思うように進まないのですが、今週も作って参りましょう。

 宮崎 Byerkut 駿の最新作「崖の上のうみょーん」。



 さて、覚えていらっしゃいますでしょうか。

 今回は従来と違って「ゲームを上から作る」と申しておりました。

 このメルマガでは必ず最初に背景を作ってプレイヤーを作って

 という手順を踏んでいたのですが、今回はいろいろな体験をしていただく

 ためにあえて違ったアプローチをご紹介します。

 自分にあったゲームの作り方のヒントになれば幸いです。



 では、上から作るとはどういうことなのでしょうか?

 簡単です。今までの反対になります。

 今までの反対とはどういうことかというと、まずタイトル画面、

 ゲーム画面、ゲームオーバー画面を最初に作るということです。

 以前作ったシューティングゲームや地球防衛ゲームでは、

 こういった画面を最後に作っていました。これをボトムアップと呼びます。

 対して今回のような作り方をトップダウンと呼びます。

 個人によるゲーム制作では好きな方を選択していただいて問題ありませんが、

 企業でゲームを作る際にはどちらのアプローチかを選択しなければ

 ならない可能性があります(進捗を画面単位で管理する場合など)。

 どちらの方が優れているかは一概には言えませんので、

 柔軟に対応できるようにしておくのがベストです。



 では、オープニング画面などを作るためにはどうしたら良いのでしょうか?



 以前はオープニングなどの画面を次のように作っていました。

  ------------------------------------------------------------------
  // 現在、どのシーンかを保持する変数
  Scene current = Opening;

  if (current == Opening) {
    /* オープニング画面に必要な処理 */
  else if (current == GameMain) {
    /* ゲーム画面に必要な処理 */
  else if (current == GameOver) {
    /* ゲームオーバー画面に必要な処理 */
  }
  ------------------------------------------------------------------

 なんとも単純ですね。これはこれで問題なく動作します。

 今までのサンプルゲームでも大活躍の if 文でした。

 しかし、頭のいい人はすぐに問題に気づきます。



 「これでは画面が増えるたびに if 文が長くなってしまう…」



 そうなんです、もし大きなゲームを作る場合、画面が 100 あったら

 この if 文は 100 もの分岐になります。単純に考えて 100 行になります。

 これを良しとするプログラマはあまり多くありません。



 では、どうすれば良いのでしょうか?



 これはC言語の特性を知っているか知っていないかの違いですので、

 いきなり答えを申し上げます。

 答えは「関数へのポインタ変数」を使うと言うことです。



 ポインタ、ついに魅惑の単語が登場いたしましたね。

 ゆっくり見ていきましょう。



 まず、普通の変数については問題ありませんでしょうか?

 変数について不安のある方は当ブログの過去記事を参照してください。

    http://www.game-create.com/archives/91
    http://www.game-create.com/archives/92

 変数には数値を入れることができます。今までのサンプルゲームでも

 プレイヤーの座標や生存時間、ライフなどを保存していました。

  ------------------------------------------------------------------
  int x = 100; int y = 100; // 座標
  int time = 0;             // 生存時間
  int life = 500;           // ライフ
  ------------------------------------------------------------------

 このように変数には数値を保存し、記憶したり後の計算に使ったり

 することができるようになるのですが、実は次のような数値を

 格納することもできます。


  ・関数の番号

  ・変数の番号


 番号? 番号とは何でしょうか?

 実は、変数や関数にはコンピュータが内部で使う番号が振られているのです。

 これは何も不思議なことではありません。というのもコンピュータは

 もともと数値しか扱えない機械ですので、変数や関数などを管理するに

 番号が必要なのです。前述の x や time などは人間がプログラミング

 しやすくするための便宜的な名前であって、プログラムが動く際には

 番号によって変数や関数にアクセスしています。

 つまり、コンピュータの中では次のようにデータが格納されているのです。

  ------------------------------------------------------------------
  int x = 100; int y = 100; // 座標
  int time = 0;             // 生存時間
  int life = 500;           // ライフ
  ------------------------------------------------------------------

    ↓

  ┌──┬──┬────────┐
  │番号│中身│意味            │
  ├──┼──┼────────┤
  │   1│ 100│変数 x の中身   │
  ├──┼──┼────────┤
  │   2│ 100│変数 y の中身   │
  ├──┼──┼────────┤
  │   3│   0│変数 time の中身│
  ├──┼──┼────────┤
  │   4│ 500│変数 life の中身│
  └──┴──┴────────┘

 この例の場合、たとえば life = life - 50; というプログラムは、

 「4番の変数の中身 = 4番の変数の中身 - 50 」という解釈になります。



 関数も同じです。関数にもひとつひとつ番号が振られています。

  ------------------------------------------------------------------
  void Opening();
  void GameMain();
  void GameOver();
  ------------------------------------------------------------------

   ↓

  ┌──┬────┐
  │番号│関数    │
  ├──┼────┤
  │   1│Opening │
  ├──┼────┤
  │   2│GameMain│
  ├──┼────┤
  │   3│GameOver│
  └──┴────┘

 たとえば Opening() という関数を呼び出すということは、

 「1番の関数を呼び出す」という解釈になります。



 しかし、ここで大半の方は疑問に思われるはずです。



 「果たして番号で管理することがそんなに効率良いのか?」

 「人間から見るとどうみても名前で管理した方が良さそうなんだが…」



 それでは、番号で管理する場合と、名前で管理する場合とを

 比べて見ましょう。今回は GameMain() という関数を呼び出してみます。

 数値で GameMain() を呼び出すには次のような解釈が必要でしたね。

  「2番の関数を呼び出す」

 では、名前で GameMain() という変数を呼び出すにはどうなるのかというと

 次のようになります。

  「4761 6d65 4d61 696e という名前の関数を呼び出す」

 ちょ、ちょっとまってくれ 4761 6d65 4d61 696e ってのは何だ?!

 そう思いますよね。でも、理由は先ほど申し上げております。



  コンピュータは数値しか扱えない



 …のです。

 GameMain という名前は内部では 4761 6d65 4d61 696e になります。

 果たして2番と 4761 6d65 4d61 696e とではどちらのほうが

 効率的にプログラムを動かすことができるでしょうか?

 少なくとも2番の方がメモリを節約することができますよね。

 「2番の関数」という情報であればチンパンジーのアイちゃんでも

 理解することができそうですが、「 4761 6d65 4d61 696e の関数」では

 人間でも識別に時間がかかってしまいます。

 これはコンピュータでも同じなのです。



 さて、話を元に戻します。



 そもそも、今回の目的はいろいろなゲームの画面を作ることです。

 オープニング画面、メイン画面、ゲームオーバー画面、

 また、全く別の画面が追加されたとしても if 文を追加しなくても

 良いようにするというのが今回のポイントです。



 では、どうすれば良いのでしょうか?



 実は、こういった場合、変数に関数の番号を入れておくことで解決する

 ことが多くあります。つまり、次のようにします。

  ------------------------------------------------------------------
  // オープニング画面の関数を用意する
  void Opening()
  {
  }

  // ゲームメイン画面の関数を用意する
  void GameMain()
  {
  }

  // ゲームオーバー画面の関数を用意する
  void GameOver()
  {
  }

  // 関数の番号を入れる変数を作る(書式はとりあえず無視してください)
  void (*currentScene)() = NULL;

  // ゲーム開始時は、このようにオープニング画面の関数を入れておく
  currentScene = Opening;

  // もし、ゲームオーバーになったらゲームメイン画面の関数を入れる
  currentScene = GameMain;

  // そしてゲームループでは常に currentScene に入っている
  // 関数を実行する!!!!(←ここがポイント)
  while (true) {
    currentScene();
  }
  ------------------------------------------------------------------

 このように currentScene という変数に「今、実行すべき画面の関数」を

 入れておき、メインループの中でその関数を実行することによって、

 if 文を増やすことなく画面を増やしたり切り替えたり

 できるようになるのです。

 ゲームが開始した直後は currentScene 変数には Opening() 関数が

 入っていますので、 currentScene() とすると Opening() 関数が

 実行されます。もし、プレイヤーが撃墜されてゲームオーバーになったら

 currentScene 変数に GameOver() 関数を入れます。この状態で、

 次に currentScene() とすると、今度は GameOver() 関数が実行されます。

 currentScene 変数の中身を変えるだけで実行する関数を変えることが

 できるんですね。この技はちょっと難しいのですが、

 便利ですので覚えておきましょう。



 さて、初級ゲームプログラミングも新たな一歩を踏み出すことができました。

 今回の内容は、あの難攻不落の城塞「ポインタ」のれっきとした使い方です。

 「あれ?もしかしてあんまり難しくないかも」と思われた方、

 しめたものです。「やっぱり難しいなぁ」と思われた方、

 来週からもメルマガで一緒に勉強していきましょう。



 次回は画面管理(シーン管理)の具体的なコーディングに入っていきます。

 新たな技術を搭載したサンプルソースをお楽しみください。



 今回も最後まで読んでいただきましてありがとうございます!

 それでは!

                                                            Byerkut.

┌┬───────────────────────────────┬┐
││ 重要記事のダイジェスト                                       ││
└┴───────────────────────────────┴┘

  ■C++ は計算と記憶しかできない
  ■外部の機能(関数)を借り受けるには #include を使う
  ■#include で借り受けた機能を使うには関数を呼び出す
    http://archive.mag2.com/0000240151/20080203171350000.html

  ■Windows プログラムには必ず WinMain() 関数から開始する
    http://archive.mag2.com/0000240151/20080209215231000.html

  ■プログラムは関数の集まり
  ■プログラムは関数を増やしてソフトウェアを作る
  ■関数には次の要素がある(名前・機能・引数・戻り値)
    http://archive.mag2.com/0000240151/20080216090000000.html
  ■関数を作には次の要素を決める(名前・機能・引数・戻り値)
    http://archive.mag2.com/0000240151/20080608200909000.html

  ■プログラムはソースコードを分散させて大きなソフトを作る
    http://archive.mag2.com/0000240151/20080525121425000.html
    http://archive.mag2.com/0000240151/20080531212858000.html

  ■ゲームを作るためには「入力」「出力」「条件分岐」が必要
    http://archive.mag2.com/0000240151/20080301221623000.html

  ■画像ファイルの絵を画面に表示する際にはメモリに読み込む
   http://archive.mag2.com/0000240151/20080406202024000.html

  ■LoadImage() 関数はコピペで使い回せる
  ■LoadImage() 関数の第2引数は
    メモリに読み込みたい画像ファイルの名前を渡す
  ■LoadImage() 関数で読み込むファイルは
    プロジェクトディレクトリにおいてある必要がある
    http://archive.mag2.com/0000240151/20080413174135000.html

┌┬─────┬─────────────────────────┬┐
││ あとがき │  発行者のつぶやきです                            ││
└┴─────┴─────────────────────────┴┘

 なんで忙しいのかというと、実は今月お引っ越しがあるのです。

 来週からはまたいつものペースに戻れるかと思いますが、

 しばらくはご迷惑をおかけしてしまうかと思います。

 ご容赦くださいませ。

┌┬───────────────────────────────┬┐
├┘                                                              └┤
│  購読の解除はこちら↓                                            │
│  http://www.game-create.com/contents/gp_beginners_ml             │
├┐                                                              ┌┤
└┴───────────────────────────────┴┘
                            - Ads space -
┌┬───────────────────────────────┬┐
├┘                                                              └┤
│ 「挫折不可能!初級ゲームプログラミング完全マニュアル」は、       │
│ 「いちばんやさしいゲームの作り方」が運営しています。             │
│                                                                  │
│  サイト     : http://www.game-create.com/                        │
│  発行元     : http://www.game-create.com/menu/about              │
│  発行者     : http://www.game-create.com/menu/profile            │
│  問い合わせ : http://www.game-create.com/menu/contact            │
│  利用規約   : http://www.game-create.com/informations/agreement  │
├┐                                                              ┌┤
└┴───────────────────────────────┴┘
                 POWERED BY LIBERTIASTER GAME STYLE.
最新号をメルマガでお届け
登録 解除

規約に同意して

登録した方には、まぐまぐの公式メルマガ(無料)をお届けします。

最近の記事

上へ戻る