2008/07/19
初級ゲームプログラミング完全マニュアル [vol.0055 2008/07/19]
┏┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳┓
┣┛ ┗┫
┃ 挫折不可能! 初級ゲームプログラミング完全マニュアル ┃
┃ ┃
┃ 第 55 号 2008/07/19 ┃
┣┓ ┏┫
┗┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻┛
- 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
┏┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳┓
┃┃ ┃┃
┃┃ 今日のメインテーマ ┃┃
┃┃ ┃┃
┃┃ 【神奈川県民のみなさん、ごめんなさい】 ┃┃
┃┃ ┃┃
┗┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻┛
前回までのメルマガで、地球防衛ゲームの主人公、まどかが
弾を連射できるようになりました。リロードなしでガトリングガンの
ごとき弾幕を演出してしまいましたが、このあたりの不自然さは
最後に調整したいと思います。
本日は敵キャラを出現させてみたいと思います。
今回も敵キャラの変数を増やして、ひとつじゃ足りないので配列にして
…というステップを踏もうと思ったのですが、さすがに同じ解説が
2回連続だとしつこいと思いましたので、一気に敵キャラ登場の
核心に迫りたいと思います。
敵キャラを登場させるために重要なポイントは、時系列で敵キャラの
登場をスケジューリングしておくという点です。
たとえば「ゲーム開始から 10 秒経過したらAという敵キャラを
登場させる」とかそういった感じのやつです。
なぜスケジューリングが必要かというと、敵キャラというのは
プレイヤーの弾と違って「何らかのキーが押されたら」という
タイミングで登場しないからです。
多くのシューティングゲームの場合、敵キャラが登場するのは
だいたい次のようなタイミングに絞られると思います。
・時間が経ったら
・背景が特定の場所まで進んだら
・見えている敵キャラが全滅したら
今回の地球防衛ゲームは最初の「時間が経ったら」敵キャラを登場させる
という手法で作っていきたいと思います。
今回もサンプルを用意しましたのでダウンロードください。
http://www.game-create.com/archives/442
ダウンロードできましたら解凍して実行してみてください。
実行の前には画像ファイルをプロジェクトファイルと同じ場所へ
コピーするのをお忘れなく。
http://archive.mag2.com/0000240151/20080413174135000.html
まずは敵キャラを3種類作ってみました。
「うごくうんこ」と「増田ジゴロン」と「はっぱ隊」です。
今回は説明のため、3種類とも動きが同じですが、今後どんどん
パワーアップさせていきたいと思います。
「敵キャラをスケジューリングして登場させる」という部分の解説は
来週へ持ち越しまして、今週は、個々の敵キャラの作り方を
見ていきたいと思います。
まずは enemies.cpp をご覧ください。
敵キャラは initialize, update, draw の3つの関数を1セットにして
作ります。もうすっかりおなじみのパターンですよね。
ただ、敵キャラが増えるたびに関数も増える点に注意してください。
今回の場合、敵キャラが3種類いますので、関数の数は 3 x 3 で
9つあります。以下は enemies.cpp の抜粋です。
------------------------------------------------------------------
enemies.cpp
------------------------------------------------------------------
#include "enemies.h"
void Enemy001_Initialize(Enemy &enemy)
void Enemy001_Update(Enemy &enemy, HWND hWindow)
void Enemy001_Draw(Enemy &enemy, HDC hBackBuffer)
void Enemy002_Initialize(Enemy &enemy)
void Enemy002_Update(Enemy &enemy, HWND hWindow)
void Enemy002_Draw(Enemy &enemy, HDC hBackBuffer)
void Enemy003_Initialize(Enemy &enemy)
void Enemy003_Update(Enemy &enemy, HWND hWindow)
void Enemy003_Draw(Enemy &enemy, HDC hBackBuffer)
------------------------------------------------------------------
Enemy001 から Enemy 003 まで、それぞれの関数に _Initialize,
_Update, _Draw の3種類がありますね。合計9つです。
もし、敵キャラをもう1体増やしたい場合は次のように関数を追加します。
------------------------------------------------------------------
void Enemy004_Initialize(Enemy &enemy)
void Enemy004_Update(Enemy &enemy, HWND hWindow)
void Enemy004_Draw(Enemy &enemy, HDC hBackBuffer)
------------------------------------------------------------------
さて、それぞれの関数で何をやっているのか見ていきましょう。
今回は Enemy001 の「うごくうんこ」を例に取ります。
まずは Enemy001_Initialize() です。
------------------------------------------------------------------
enemies.cpp
------------------------------------------------------------------
void Enemy001_Initialize(Enemy &enemy)
{
enemy.x = (rand() % ENEMIES_SCREEN_WIDTH) - 32;
enemy.y = -10;
enemy.width = 32;
enemy.height = 32;
}
------------------------------------------------------------------
この関数は敵キャラの初期化をしています。
つまり、敵キャラが画面に登場するときに実行する処理です。
enemy.x と enemy.y に敵キャラの初期位置(座標)をセットし、
enemy.width と enemy.height に敵キャラの大きさをセットします。
(rand() % ENEMIES_SCREEN_WIDTH) - 32; というのが見慣れないかも
しれませんが、これは「画面の幅のどこかランダムで」という意味です。
もし、「この敵キャラは 100 のX座標の場所に登場させたいんだ!」
という場合は、ここを enemy.x = 100; とすれば問題ありません。
次に Enemy001_Update() です。
------------------------------------------------------------------
enemies.cpp
------------------------------------------------------------------
void Enemy001_Update(Enemy &enemy, HWND hWindow)
{
enemy.y += 2;
}
------------------------------------------------------------------
ここでは「敵キャラを動かす処理」を書いています。
今回の場合、敵は「ひたすらまっすぐ下に移動」しますので、
enemy.y に入っているY座標に2を足しています。
なぜY座標に2を足すだけで「下に移動」するのかというと、
この関数は1秒間に 60 回呼び出されているためです。
ゲームの画面は1秒間に 60 回も内容を更新して、キャラクターなどが
なめらかに動いているように見せています。つまり、この敵キャラは
毎秒2ドットずつ下に移動していることになるのです。
あとはアニメーションの原理で、少しずつ動いている絵は
なめらかに動いているように見えるというわけです。
詳しくは当メルマガの過去記事を参照ください。
http://archive.mag2.com/0000240151/20080503100000000.html
最後に Enemy001_Draw() です。
------------------------------------------------------------------
enemies.cpp
------------------------------------------------------------------
void Enemy001_Draw(Enemy &enemy, HDC hBackBuffer)
{
BitBlt(hBackBuffer, enemy.x, enemy.y, enemy.width, enemy.height,
enemy.graphic.getMask(), 0, 0, SRCAND);
BitBlt(hBackBuffer, enemy.x, enemy.y, enemy.width, enemy.height,
enemy.graphic.getBitmap(), 0, 0, SRCPAINT);
}
------------------------------------------------------------------
ここでは「敵キャラを描画する処理」を書いています。
enemy.graphic に入っている Study::Bitmap の画像を BitBlt() 関数に
よって画面( hBackBuffer )に表示しています。
ちなみにこの関数も1秒間に 60 回呼び出されます。
なぜ、「1体の敵キャラを描画するために BitBlt() を2回
使っているのか」というと、敵キャラクターの背景を透過するためです。
敵キャラの画像( enemies.cpp )を開いていただけるとわかるのですが、
敵キャラの画像は背景がピンク色になっています。
なぜピンク色になっているのかというと「実際に使うときに背景と
なじませたい部分」だからです。これをゲームプログラミング用語で
「透過色」または「カラーキー」と言います。
Windows では BitBlt() を2回使うことで、この「カラーキー」の部分を
背景となじませることができるのです。
詳しくは後日のブログを参照ください。
(済みませんこれが終わったら書きます ^^; )
さて、敵キャラを登場させるための必要なポイントは以上です。
まずは、サンプルコードの数値をいろいろと変更して遊んでみてください。
余裕のある人はオリジナルの敵キャラクターを作ってみると理解が
深まります。「こんな敵キャラを作ってやったぜ!」という方は
お問い合わせフォームにてご連絡ください(ソースも添付してください)。
次回以降のサンプルソースに組み込んでみなさんに楽しんでもらおうと
思います。
次回は、シューティングゲームのサンプルの時に解説を省略した
「敵キャラを登場させるためのスケジューリング」について
触れてみたいと思います。
今回も最後まで読んでいただきましてありがとうございます!
それでは!
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
┌┬─────┬─────────────────────────┬┐
││ あとがき │ 発行者のつぶやきです ││
└┴─────┴─────────────────────────┴┘
Lの季節2のメインヒロインが公開されましたが、
まさか鵜野杜椎奈(うのもりしいな)が登場するとは思いませんでした。
彼女を攻略するのはすごく大変だったんですよ。隠しキャラでしたから。
あのシリーズは単なるビジュアルノベルではないから楽しいです。
しかしながら我が家には PS2 がありません。
PSP 移植を待つしかありませんね。
┌┬───────────────────────────────┬┐
├┘ └┤
│ 購読の解除はこちら↓ │
│ 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.


