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

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

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

規約に同意して

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

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

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

 みなさま、こんにちは!

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

 ついこの間まで寒い寒いと嘆いていたのに、先日は真夏日を記録しました。

 パソコンが熱暴走したこともあって、扇風機が大活躍です。

 自分は小さい頃にひどい夏バテを経験したことがあって、

 それ以来、夏は十分に水分を取って、食事も3色きっちり

 食べるようにしています。おかげさまで夏バテはなくなりましたが、

 体が重くなりがちになってしまいました。むむむ。

 さて、今週は地球防衛ゲームの主人公が弾を発射します。

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

  ・今日のメインテーマ
      【まどか撃て!明日を取り戻すんだ!】

  ・あとがき

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

  ■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

┏┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳┓
┃┃                                                              ┃┃
┃┃                      今日のメインテーマ                      ┃┃
┃┃                                                              ┃┃
┃┃             【まどか撃て!明日を取り戻すんだ!】             ┃┃
┃┃                                                              ┃┃
┗┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻┛

 先週までのメルマガで、ソースファイルや関数が増える理由や、

 キャラクターの情報を記録するためには構造体を使うのが一番

 便利であるということを学ぶことができました。

 今週は、前回と同じようなイメージで、プレイヤーが撃つ弾を

 実装してみたいと思います。



 今回もサンプルソースを用意しましたのでダウンロードください。

    http://www.game-create.com/archives/415

 ダウンロードできましたら解凍して、画像ファイルを

 プロジェクトファイルと同じ場所にコピーしてビルドしてみてください。

 一見、なんら変わりのない画面が表示されますが、

 実はスペースキーを押すと弾を撃てるようになっています。

 しかし、いろいろ動かしていると、ある動作の不自然さに気づくはずです。

 その原因と対策は来週へ持ち越しまして、今週は新しいソースについて

 解説していきたいと思います。



 まず、今回増えたソースファイルは player_bullets.h と

 player_bullets.cpp です。 player_bullets.cpp にはプレイヤーが撃つ

 弾を動かしたり表示したりするためのプログラムが書いてあります。

 一方の player_bullets.h には player_bullets.cpp や、

 他の *.cpp ファイルに player_bullets.cpp の関数の存在を

 教えるための情報が記述されています。

 詳しくは、6月分のメルマガか、当サイトのブログを参照ください。

    http://www.game-create.com/archives/399
    http://www.game-create.com/archives/414



 実は、今回の追加は非常にシンプルで、ほとんど何もしていません。

 まず player_bullets.cpp を開いていただきたいのですが、

 どこかで見覚えのある記述ばかりかと思われます。

 簡単に概要を説明しますと次のようになります。

  ------------------------------------------------------------------
  player_bullets.cpp
  ------------------------------------------------------------------
    #include "player_bullets.h"
    
    static PlayerBullet playerBullet; ←弾の情報を保存する構造体
    
    void InitializePlayerBullets(HWND hWindow, HDC hBackBuffer)
    {
      // ここに弾の初期化処理が書いてある
    }
    
    void FinalizePlayerBullets(HWND hWindow, HDC hBackBuffer)
    {
      // ここに弾の終了処理が書いてある
    }
    
    void UpdatePlayerBullets(HWND hWindow, HDC hBackBuffer)
    {
      // ここで弾を画面上へ移動させている
    }
    
    void DrawPlayerBullets(HWND hWindow, HDC hBackBuffer)
    {
      // ここで弾を画面に表示している
    }
    
    void ShotPlayerBullet(Player &player)
    {
      // スペースキーが押されたら弾を新しい発射する
    }
  ------------------------------------------------------------------



 InitializePlayerBullets() 関数では、前回学んだ構造体へ初期値を

 設定しています。今回はプレイヤーの弾の情報を保存するための

 構造体ですので PlayerBullet という名前にしました。

 構造体と聞いて「面倒そうだなぁ」と尻込みする必要はありません。

 要は自分の中に変数がある変数です。前回の身体測定のお話を

 思い出しましょう。

  ------------------------------------------------------------------
  player_bullets.cpp
  ------------------------------------------------------------------
    void InitializePlayerBullets(HWND hWindow, HDC hBackBuffer)
    {
      playerBullet.x      = -PLAYER_BULLETS_CHIP_WIDTH;
      playerBullet.y      = -PLAYER_BULLETS_CHIP_HEIGHT;
      playerBullet.width  = PLAYER_BULLETS_CHIP_WIDTH;
      playerBullet.height = PLAYER_BULLETS_CHIP_HEIGHT;
      playerBullet.graphic.load(hBackBuffer, TEXT("player_bullet.bmp"), RGB(255, 0, 255));
    }
  ------------------------------------------------------------------



 次の FinalizePlayerBullets() 関数では、読み込んだ画像のメモリを

 解放しているのですが、実は Study::Bitmap は自動的に解放処理が

 実行されるので、ここでは書く必要がありません。

 ですので、解説は省略したいと思います。

  ------------------------------------------------------------------
  player_bullets.cpp
  ------------------------------------------------------------------
    void FinalizePlayerBullets(HWND hWindow, HDC hBackBuffer)
    {
      playerBullet.graphic.dispose(); ←実は書かなくてもOK
    }
  ------------------------------------------------------------------



 次の UpdatePlayerBullets() 関数が重要です。

 ここではプレイヤーが撃った弾のY座標を変化させ、

 弾が画面の上へ向かって飛ぶように見せかけています。

  ------------------------------------------------------------------
  player_bullets.cpp
  ------------------------------------------------------------------
    void UpdatePlayerBullets(HWND hWindow, HDC hBackBuffer)
    {
      playerBullet.y -= PLAYER_BULLETS_MOVE_SPEED;
    }
  ------------------------------------------------------------------

 画面のY座標は、上に行くほど数値が小さくなりますので、

 引き算を繰り返すと、だんだん上に向かって動いているように

 見えるのです。



 次の DrawPlayerBullets() 関数は、ただ単に弾を表示しているだけです。

  ------------------------------------------------------------------
    void DrawPlayerBullets(HWND hWindow, HDC hBackBuffer)
    {
      BitBlt(hBackBuffer, playerBullet.x, playerBullet.y, playerBullet.width, playerBullet.height,
             playerBullet.graphic.getMask(), 0, 0, SRCAND);
      BitBlt(hBackBuffer, playerBullet.x, playerBullet.y, playerBullet.width, playerBullet.height,
             playerBullet.graphic.getBitmap(), 0, 0, SRCPAINT);
    }
  ------------------------------------------------------------------

 もう、おなじみの BitBlt() 関数ですよね。

 「ちょっとまて!なんで弾を表示したいだけなのに

  2回も BitBlt() を呼び出しているんだ?!」と気づかれた方は

 かなりするどいです。この理由については後ほど

 ブログにて解説いたしますので、しばらくお待ちください。



 さて、次が一番重要です。

 最後の ShotPlayerBullet() 関数は、スペースキーが押されたときに

 新しい弾を発射するための関数です。

  ------------------------------------------------------------------
    void ShotPlayerBullet(Player &player)
    {
      playerBullet.x = player.x + ((player.width / 2) - (playerBullet.width / 2));
      playerBullet.y = player.y;
    }
  ------------------------------------------------------------------

 具体的には何をしているのかというと、

 「プレイヤーの現在位置を参考に」して、

 新しい弾の座標を「初期化しなおしている」のです。

 この「初期化しなおす」というのがミソです。



 弾は最初に InitializePlayerBullets() 関数によって初期化されて

 いるのですが。放っておくと弾は画面の上へ向かって進んでいき、

 いずれは画面の外へ出てしまいます。

 画面外へでた弾はもう使わないので捨てても良いのですが、

 せっかく確保した playerBullet という変数のメモリがもったいないので、

 画面外へ消えた弾の座標を、もう一度、プレイヤーの近くに

 移動しているのです。

 弾は UpdatePlayerBullets() 関数によって常に上へ進みますので、

 結果、「新しい弾を発射している」ように見えるのです。



 なにやらいろいろとやっていますが、

 何も難しいことはありません、要は…



  弾の情報をリサイクルしている!



 …だけです。

 現実には発射された弾はリサイクルされませんが、

 コンピュータの資源は有限ですので、エコの意識が必要というわけです。

 ばかばかしいかもしれませんが、これは非常に重要なのです。



 ちなみにこの ShotPlayerBullet() 関数は、

 player.cpp の中から呼ばれています。

 「スペースキーが押されたのをどうやって検知しているのだろう?」と

 疑問に思われた方は player.cpp の中身をご覧ください。



 さて、これでプレイヤーが発射する弾の解説は終了なのですが、

 先ほどのサンプルゲームの動作を見たり、

 メルマガの解説を読んだりしているうちに、

 おかしな仕様に気づく方がいらっしゃることと思います。

 もし、気づいていらっしゃらないようでしたら、

 スペースキーを連打してみてください。すぐにわかります。

 次回は、このおかしな動作を直してみたいと思います。



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

 それでは!

                                                            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

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

 ブログを解説してから1周年が経とうとしていますが、

 最近、ようやっとオリジナルゲームのアイデアが固まってきました。

 実は自分は、ゲームの主流が 2D から 3D に変わる過渡期を

 ゲームフリークとして過ごしてきたので 2D と 3D の良さを

 なんとか両方とも盛り込んでゲームを作りたいと思っていました。

 最近、やっと知識が現実に追いついてきた感じです。

 ここまでの苦心もメルマガに盛り込みたいです。

┌┬───────────────────────────────┬┐
├┘                                                              └┤
│  購読の解除はこちら↓                                            │
│  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.
最新号をメルマガでお届け
登録 解除

規約に同意して

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

最近の記事

上へ戻る