2008/09/06
初級ゲームプログラミング完全マニュアル [vol.0062 2008/09/06]
┏┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳┓
┣┛ ┗┫
┃ 挫折不可能! 初級ゲームプログラミング完全マニュアル ┃
┃ ┃
┃ 第 62 号 2008/09/06 ┃
┣┓ ┏┫
┗┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻┛
- Ads space -
┌┬───────────────────────────────┬┐
││ はじめに ││
└┴───────────────────────────────┴┘
みなさま、こんにちは!
個人ゲーム制作アドバイザーの Byerkut です!
残暑まっさかり。まったく暑いですね…
しかも、今週はインフィニットアンディスカバリーの発売があります。
暑さに加えて熱さがふつふつと煮えたぎっており、まさに2重苦。
自分は、ゲームによってゲーム制作スピリッツが刺激されるタイプ
ですので、今年は年末まで精力的に活動できそうです。
まだ、モンスターハンターが終わってないけどがんばります。
さて、今週は地球防衛ゲームの最終回です。
┌┬───────────────────────────────┬┐
││本日のラインナップ ││
└┴───────────────────────────────┴┘
・今日のメインテーマ
【地球防衛ゲーム最終話〜それぞれの明日へ〜】
・あとがき
┌┬───────────────────────────────┬┐
││ みんなの備忘録 ││
└┴───────────────────────────────┴┘
■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://archive.mag2.com/0000240151/20080809095157000.html
今回はポイントのみ解説いたします。
まず、敵キャラクターがやられたときの爆発ですが、
今回は Effect003 として実装しました。
------------------------------------------------------------------
effects.cpp
------------------------------------------------------------------
void Effect003_Initialize(Effect &effect)
{
effect.lifeTime = 60;
}
void Effect003_Draw(Effect &effect, HDC hBackBuffer)
{
HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0));
HGDIOBJ old = SelectObject(hBackBuffer, brush);
if (effect.time < 30) {
int width = effect.time * 2;
Ellipse(hBackBuffer,
effect.x - width, effect.y - width,
effect.x + width, effect.y + width);
} else {
int width = 120 - (effect.time * 2);
Ellipse(hBackBuffer,
effect.x - width, effect.y - width,
effect.x + width, effect.y + width);
}
SelectObject(hBackBuffer, old);
DeleteObject(brush);
}
------------------------------------------------------------------
ちょっと読みにくいかと思いますが、解説すると次のようになります。
・0 〜 30 フレームまでは赤い円をだんだん大きく描画する
・30 〜 60 フレームまでは赤い円をだんだん小さく描画する
つまり、このエフェクトが始まると、円がだんだん大きくなり、
大きくなりきった後、だんだん小さくしぼむということです。
爆炎をイメージしてみました。これは実行してみればわかりますので、
とりあえず次に進んでください。
次のエフェクトはボスキャラクターがやられたときの爆炎です。
関数は Effect004 です。
------------------------------------------------------------------
effects.cpp
------------------------------------------------------------------
void Effect004_Initialize(Effect &effect)
{
effect.lifeTime = 120;
}
void Effect004_Draw(Effect &effect, HDC hBackBuffer)
{
HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0));
HGDIOBJ old = SelectObject(hBackBuffer, brush);
if (effect.time < 60) {
int width = effect.time * 10;
Ellipse(hBackBuffer,
effect.x - width, effect.y - width,
effect.x + width, effect.y + width);
} else {
int width = 1200 - (effect.time * 10);
Ellipse(hBackBuffer,
effect.x - width, effect.y - width,
effect.x + width, effect.y + width);
}
SelectObject(hBackBuffer, old);
DeleteObject(brush);
// シーンをエンディングに切り替える
currentScene = Ending;
}
------------------------------------------------------------------
「どこが違うんだ?」と思われた方、正解です。
実は違いは爆炎の大きさしかありません。
ボスがやられたときのエフェクトは派手にしたかったので、
爆炎の大きさは 10 倍になっています。
なんとも頭の悪い比率ですね。
しかし、ここにはもうひとつ重要なポイントがあります。
最後の行を見てください。
------------------------------------------------------------------
// シーンをエンディングに切り替える
currentScene = Ending;
------------------------------------------------------------------
そうなんです。ボスがやられたエフェクトが発生したときに
シーンをエンディングに切り替えているのです。
こうしないとボスを倒してもゲームが終了しなくなってしまいます。
このようにゲームでは「何らかのエフェクトの終了を待って
シーンが変わる」ということがあります。
これは非常に重要ですので是非覚えておいてください。
みなさまが中級者、上級者になったときにこの重要さがわかります。
さて、これらの変更が加わった地球防衛ゲームのサンプルを用意しました。
当サイトからダウンロードください。
http://www.game-create.com/archives/679
ダウンロードできましたら、画像ファイルをプロジェクトディレクトリに
コピーして実行してみてください。ゲームが始まったら敵を
ガンガン倒していきましょう。爆炎のエフェクトが追加されています。
なお、ボスを少し強くしてみました。
ゲームのバランス敵には良い具合になったかと思うのですが、
あまりに強すぎる場合は enemy.life の値を小さくしてみてください。
------------------------------------------------------------------
enemies.cpp
------------------------------------------------------------------
void Boss_Initialize(Enemy &enemy)
{
enemy.life = 2000; // ←ここ
enemy.x = 0;
enemy.y = -200;
enemy.width = 240;
enemy.height = 160;
}
------------------------------------------------------------------
さて、長らくおつきあいいただいた地球防衛ゲームですが、
最低限ではあるものの、ようやっと完成を見ることができました。
これもみなさまの成長あったればこそです。
最初のコンセプトにあったとおり、「画像ファイルを使うと
とたんにゲームらしくなる」という言葉の意味も、
今ではご理解いただけていると思います。以前作ったシューティングゲーム
サンプルとは比べものにならないですよね(内容はほぼ同じですが)。
さて、このあたりで次回からの内容をお伝えしなければならないのですが、
「こういうテーマを取り扱って欲しいのに」と思われることありませんか?
「シューティングだけじゃなくて RPG を取り扱って欲しい」
「もっと実用的なタスクシステムみないな技術を取り上げて欲しい」
「パソコンゲームじゃなくて Flash の作り方を教えて欲しい」などなど…
そういった方々のために、今回からアンケートフォームを用意いたしました。
http://form.mag2.com/nacrericia
その思いの丈を Byerkut にぶつけてやってください。
誠心誠意応えてまいりたいと思います。
アンケートに答えていただいた方にはお礼として…
秘密のゲームプログラミング講座
…へのアクセスキーを差し上げます。
秘密コンテンツってなんですか? なんでしょう? 秘密です。
だから秘密コンテンツなんです。お楽しみにお待ちください。
今回も最後まで読んでいただきましてありがとうございます!
それでは!
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.


