2008/08/09
初級ゲームプログラミング完全マニュアル [vol.0058 2008/08/09]
┏┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳┓
┣┛ ┗┫
┃ 挫折不可能! 初級ゲームプログラミング完全マニュアル ┃
┃ ┃
┃ 第 58 号 2008/08/09 ┃
┣┓ ┏┫
┗┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻┛
- 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
┏┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳┓
┃┃ ┃┃
┃┃ 今日のメインテーマ ┃┃
┃┃ ┃┃
┃┃ 【地球防衛戦線最大のピンチ!敵キャラの特攻!】 ┃┃
┃┃ ┃┃
┗┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻┛
前回までのメルマガで、敵キャラを倒せるようになりました。
しかし、敵キャラも黙ってやられるわけではありません。
今回は敵キャラの特攻を実装してみました。
早速サンプルをご覧ください。
http://www.game-create.com/archives/575
ダウンロードできたら実行してみてください。
最初、どこが新しくなったのかわからないと思いますが、
一度、わざと敵の侵入を許してみてください。
とんでもないエフェクトが追加されています。
さて、このエフェクトはどうやって動いているのでしょうか?
なお、今回の内容はちょっとややこしいので、
「難しいな」と感じられましたら読み飛ばすことをおすすめします。
今回の内容はそれほど大事なテーマではありません。
まず、今回追加されたファイルが次のようになります。
・effects.h
・effects.cpp
・effects_controller.h
・effects_controller.cpp
effects.cpp は個々のエフェクトの初期化と描画処理、
effects_controller.cpp はエフェクトの管理を担当しています。
「今回は4つもファイルが増えたのか〜」と面倒がる必要はありません。
すでにこの関係と同じソースファイルが追加されています。
それは…
・enemies.h
・enemies.cpp
・enemies_controller.h
・enemies_controller.cpp
…の4つです。つまり敵キャラのソースとほとんど同じ
構成になっているのです。中身もほとんど同じです。
簡単に説明しますと effects_controller.cpp でエフェクト全体の
初期化と描画指示を担当しています。
爆発エフェクトは画面に表示されるたびに effects という配列変数に
情報が記録され、その情報を基に描画をするのですが、
この配列変数を初期化しているのが effects_controller.cpp です。
------------------------------------------------------------------
effects_controller.cpp
------------------------------------------------------------------
void InitializeEffectsController(HWND hWindow, HDC hBackBuffer)
{
for (int i = 0; i < EFFECTS_CONTROLLER_MAX; i++) {
effects[i].status = Deactive; // ←初期化
}
}
------------------------------------------------------------------
effects 配列の中身は次のようになっています。
------------------------------------------------------------------
effects_controller.cpp
------------------------------------------------------------------
typedef struct structTagEffect {
int x; // ←エフェクトのX座標
int y; // ←エフェクトのY座標
int time; // ←エフェクトの生存時間
int lifeTime; // ←エフェクトの制限時間
EffectStatus status; // ←ステータス(Active or Deactive)
pEffectDrawer drawer; // ←描画関数
} Effect, *pEffect;
------------------------------------------------------------------
ここでは status のみ初期化していますが、
status が Deactive のエフェクトは画面に表示されませんので、
ここはこれで問題ありません。
また、 effects 配列に記録されている情報を基に、
「描画してください」と指示するのも effect_controller.cpp です。
ちなみに、時間が過ぎたエフェクトを消すのもここでやっています。
------------------------------------------------------------------
effects_controller.cpp
------------------------------------------------------------------
void DrawEffectsController(HWND hWindow, HDC hBackBuffer)
{
for (int i = 0; i < EFFECTS_CONTROLLER_MAX; i++) {
if (effects[i].status == Active) {
// グラフィックを描画する
effects[i].drawer(effects[i], hBackBuffer);
// エフェクトのタイムリミットを過ぎたら消す
if (effects[i].lifeTime < effects[i].time) {
effects[i].status = Deactive;
} else {
effects[i].time++;
}
}
}
}
------------------------------------------------------------------
今回のキモはエフェクトの新規作成です。
effects_controller.cpp は enemies_controller.cpp と
似たような構成になっているとお伝えしましたが、
敵キャラの管理の時とは違って、エフェクトが表示されるのは、
スケジュールではなく「敵キャラの侵入を許したとき」という
イベントが発生したときです。
何が言いたいのかというと、エフェクトを新規作成するのは
他のソースファイルの役割であるということです。
今回は「敵キャラの侵入を許したとき」に大爆発するように作りましたが、
敵キャラの侵入を許したのがわかるのは enemies_controller.cpp の
中ですので enemies_controller.cpp の次の位置で、
敵キャラの大爆発を発生させています。
------------------------------------------------------------------
enemies_controller.cpp
------------------------------------------------------------------
// 敵キャラを動かす
for (i = 0; i < ENEMIES_CONTROLLER_MAX; i++) {
if (enemies[i].status == Alive) {
enemies[i].updater(enemies[i], hWindow);
// 画面外へ出た敵を殺す
if ((ENEMIES_CONTROLLER_SCREEN_HEIGHT + enemies[i].height) < enemies[i].y) {
enemies[i].status = Dead;
// 超爆発エフェクトを掛ける ←【ここ】
CreateEffect(enemies[i].x + (enemies[i].width / 2), enemies[i].y,
Effect002_Initialize, Effect002_Draw);
}
}
}
------------------------------------------------------------------
CreateEffect() 関数はエフェクトを新規作成する関数です。
引数にエフェクトを発生させたいX座標とY座標、
そしてエフェクトの初期化関数と描画関数を渡します。
さて、エフェクトの初期化関数と描画関数とはどこにあるのでしょうか?
それは effects.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
┌┬─────┬─────────────────────────┬┐
││ あとがき │ 発行者のつぶやきです ││
└┴─────┴─────────────────────────┴┘
人間、趣味にかけるお金は半端じゃないですよね。
先日、従兄弟が 21 万円のカーナビを買っていて
思わずびっくりしてしまいました。従兄弟は車好きなんです。
逆に自分が 13,800 円の書籍を買ったと言ったら、
今度は従兄弟が驚いていました。私は本好きなんです。
どっちも病気ですね…
┌┬───────────────────────────────┬┐
├┘ └┤
│ 購読の解除はこちら↓ │
│ 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.


