2008/03/01
初級ゲームプログラミング完全マニュアル [vol.0035 2008/03/01]
┏┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳┓
┣┛ ┗┫
┃ 挫折不可能! 初級ゲームプログラミング完全マニュアル ┃
┃ ┃
┃ 第 35 号 2008/03/01 ┃
┣┓ ┏┫
┗┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻┛
- Ads space -
┌┬───────────────────────────────┬┐
││ はじめに ││
└┴───────────────────────────────┴┘
みなさま、こんにちは!
個人ゲーム制作アドバイザーの Byerkut です!
ようやっと寒さも和らいで参りました、
やはり都心部より北の寒さはこたえました。
さて、気がつけばもう3月です。
卒業式を迎えられた後は新生活が始まるのですね。
期待と不安でいっぱいです。
私もそうでした。
新しい生活でも自分を見失わずがんばってください!
┌┬───────────────────────────────┬┐
││本日のラインナップ ││
└┴───────────────────────────────┴┘
・今日のメインテーマ
【ゲームが成り立つ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
┏┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳┓
┃┃ ┃┃
┃┃ 今日のメインテーマ ┃┃
┃┃ ┃┃
┃┃ 【ゲームが成り立つ3大要素】 ┃┃
┃┃ ┃┃
┗┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻┛
先週、プログラムは関数によってできているということを
確認していただきました。それをふまえて、
プログラムのポイントを次のようにまとめることができます。
・C++ は計算と記憶しかできない
・外部の機能(関数)を借り受けるには #include を使う
・#include で借り受けた機能を使うには関数を呼び出す
・Windows プログラムには必ず WinMain() 関数から開始する
・関数には次の要素がある(名前・機能・引数・戻り値)
・プログラムは関数の集まり
・プログラムは関数を増やしてソフトウェアを作る
増えて参りましたが、ひとつひとつに難しいことはないかと思います。
さて、今回は前々回で解説できなかった「関数の戻り値」についてふれ、
関数の基本を押さえてしまいましょう。
少し脱線します。
唐突ではございますが、
ゲームを構成するために必要な要素とはいったい何でしょうか?
言い換えると「何ができればゲームが作れるでしょうか?」という
質問になります。
つまり、ゲームを作るためにはコンピュータによって
何ができなければならないのか?ということなのですが、
答えは「入力」「出力」「条件分岐」の3つです。
ゲームを作るためにはこの3つが必要で、
逆に言えばこの3つがあればゲームが作れます。
(もちろん、本格的なゲームや複雑なゲームは無理ですよ?通信とか)
その証拠に、前回メルマガに掲載した「ハイアンドローゲーム」は
この「入力」「出力」「条件分岐」を駆使して作られています。
もう一度ソースコードを掲載します。
------------------------------------------------------------------
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPreviousInstance,
LPSTR lpsCommandLine,
int nCommandShow)
{
PTCHAR title;
PTCHAR message;
int result;
// タイトルの設定
title = TEXT("ハイ&ロー");
// ゲーム説明
message =
TEXT("ハイ&ローゲームです!\n")
TEXT("\n")
TEXT("ハイの場合は「はい」を選択、\n")
TEXT("ローの場合は「いいえ」を選択してください。\n");
MessageBox(NULL, message, title, MB_OK);
// 問題1の出題
message =
TEXT("問題1\n")
TEXT("\n")
TEXT("Byerkut さんの誕生日は4月の15日より…\n")
TEXT("ハイ?ロー?\n");
result = MessageBox(NULL, message, title, MB_YESNO);
// 問題1の答え合わせ
if (result == IDYES) {
message =
TEXT("残念!14日なのでローです!\n")
TEXT("\n")
TEXT("どうでもいい知識ですので忘れてください…\n");
} else if (result == IDNO) {
message =
TEXT("正解です!おめでとうございます!\n")
TEXT("\n")
TEXT("Byerkut さんは4月の14日に生まれました。\n")
TEXT("ちなみに南海キャンディーズの山ちゃんの誕生日もこの日です。");
}
MessageBox(NULL, message, title, MB_OK);
// ゲーム終了
message =
TEXT("ゲーム終了です!\n")
TEXT("\n")
TEXT("Thank you for playing です!\n");
MessageBox(NULL, message, title, MB_OK);
return 0;
}
------------------------------------------------------------------
まず、「入力」と「出力」がゲームにとって重要なのは当然ですよね。
入力できないと、マリオが動きませんし、ジャンプもできません。
出力できないと、ゲームの画面がモニタやテレビに映りません。
では、「条件分岐」はなぜ必要なのでしょうか?
これも考えてみれば当然です。
条件分岐はプレイヤーの入力に反応するために必要です。
たとえば「もし、ボタンを押されたら弾を発射する」や
「もし、敵キャラと衝突したらゲームオーバーにする」などです。
もし、この条件分岐の要素が無ければ、
ゲームはただの決まった映像が流れるだけの映像作品となってしまい、
テレビ番組や映画となんらかわりはなくなってしまいます。
ゲームはプレイヤーに反応するからこそゲームたり得るのです。
では、先週のハイアンドローゲームで「入力」「出力」「条件分岐」が
実際にどのように駆使されているのかを見ていきましょう。
■出力
ハイアンドローゲームにはどのような出力があったでしょうか?
出力は「表示」と置き換えてみるとわかりやすいかもしれません。
では、ハイアンドローゲームにどんな表示があったかというと、
メッセージボックスがありました。
…というかそれしかありませんでした。
ゲーム中ではメッセージボックスによって
「出題」「採点」「終了の挨拶」という出力部分を担当させていました。
■入力
ハイアンドローゲームにはどのような入力があったでしょうか?
これはもしかしたら思い当たらない方もいらっしゃるかもしれません。
でも、しっかり「入力」の要素が存在しています。
実際にゲームを動かしてみてください。
「ハイ」か「ロー」の2択の問題が出題されると思いますが、
その答えをどうやってコンピュータに伝えていますか?
「はい」か「いいえ」のボタンを押していませんか?
それが、ハイアンドローゲームにおける「入力」になります。
ゲームにおいて入力とは、コントローラのボタンやジョイスティックの軸、
マウスなどが代表的ですが、このようなボタンも立派に入力といえます。
では、「はい」か「いいえ」のどちらのボタンが押されたのかを
どうやって取得しているのでしょうか?
どちらのボタンが押されたのかがわからないと、
問題に正解したのか不正解になったのか判断することができません。
実は、それこそ今回のメインテーマである「関数の戻り値」なのです。
ハイアンドローゲームでは次の場所で、
どちらのボタンが押されたのかを取得しています。
------------------------------------------------------------------
// 問題1の出題
message =
TEXT("問題1\n")
TEXT("\n")
TEXT("Byerkut さんの誕生日は4月の15日より…\n")
TEXT("ハイ?ロー?\n");
result = MessageBox(NULL, message, title, MB_YESNO);
~~~~~~
↑ここ
------------------------------------------------------------------
「これって問題を出しているところじゃないの?」と
思われるかもしれませんね。
たしかにその通りなのですが、よく見てください。
MessageBox() という関数の左側に = をはさんで
result という変数を使っているのがおわかりいただけるかと思います。
これは「代入」とよばれる式で、MessageBox() 関数の値を
result という変数へ保存しているという意味になります。
「代入」についての詳細は当ブログの記事をご覧ください。
http://www.game-create.com/archives/91
では MessageBox() 関数の値とはなんでしょうか?
それが「関数の戻り値」です。
実は、関数は「機能を実行した結果として
何らかの値を返すことができる」のです。
関数が戻り値を返してくれることによって、関数を使ったプログラムは
「その関数の実行によってどのような変化があったか?」が
わかるようになるのです。
今回のハイアンドローゲームの場合は MessageBox() 関数の戻り値を
調べることによって「どちらのボタンが押されたのか」が
わかるようになります。
つまり MessageBox() 関数の戻り値は
「押されたボタン」ということになります。
------------------------------------------------------------------
result = MessageBox(NULL, message, title, MB_YESNO);
------------------------------------------------------------------
という一文は、問題を出題するのと同時に、
押されたボタンを取得していたのです。
押されたボタンの情報を格納している result 変数は、
次の「条件分岐」で使っています。
■条件分岐
ハイアンドローゲームにはどのような条件分岐があったでしょうか?
条件分岐とは、条件によってプログラムの実行を分岐することです。
条件分岐がないとプログラムは上から下へ決まった流れを実行するだけの、
テレビ番組や映画のような映像作品と同じになってしまいます。
では、ハイアンドローゲームでは
どこでプログラムを分岐していたのでしょうか?
これも実行してみればすぐにわかります。
最初の問題で、「はい」を選択してみてください。
不正解になりますよね?
では、もう一度実行して、次は「いいえ」を選択してみてください。
今度は正解になったはずです。
ここに条件分岐の要素があります。
つまり、第1問で「はい」を選択したか「いいえ」を選択したかによって
後に実行されるプログラムの内容が変わっているのです。
実際に条件分岐を使っているのが次の部分です。
------------------------------------------------------------------
// 問題1の答え合わせ
if (result == IDYES) {
message =
TEXT("残念!14日なのでローです!\n")
TEXT("\n")
TEXT("どうでもいい知識ですので忘れてください…\n");
} else if (result == IDNO) {
message =
TEXT("正解です!おめでとうございます!\n")
TEXT("\n")
TEXT("Byerkut さんは4月の14日に生まれました。\n")
TEXT("ちなみに南海キャンディーズの山ちゃんの誕生日もこの日です。");
}
MessageBox(NULL, message, title, MB_OK);
------------------------------------------------------------------
このように条件分岐には if 文を使います。
if 文の詳細は当ブログの記事を参照してください。
http://www.game-create.com/archives/275
ここでは先ほど MessageBox() 関数の戻り値を保存した
result という変数を使っています。
result には「はい」と「いいえ」のどちらのボタンが押されたのかが
保存されていますので、「はい」が押されていた場合は不正解の処理、
「いいえ」が押されていた場合は正解の処理を実行しているのです。
MessageBox() 関数は「はい」が押された場合は IDYES 、
「いいえ」が押された場合は IDNO を返しますので、
次のようにして判定しています。
------------------------------------------------------------------
if (result == IDYES) {
~~~~~~~~~~~~~~~ ←押されたボタンは「はい」か?
// 「はい」が押された場合の処理
} else if (result == IDNO) {
~~~~~~~~~~~~~~ ←それとも「いいえ」か?
// 「いいえ」が押された場合の処理
}
------------------------------------------------------------------
さて、急ぎ足ではありましたが、ゲームを作るためには、
「入力」「出力」「条件分岐」が必要であるということが
おわかりいただけたかと思います。
しかしながら、大変申し訳ないことに、今日までのお話は
抽象概念が中心でしたので、まだ、ハイアンドローゲームの
サンプルコードを理解するまでには至っていないと思います。
そこで次回は、このハイアンドローゲームに問題を追加して、
今回お伝えした内容を「より具体的に理解」していこうと思います。
最終的には、ハイアンドローゲーム程度のゲームを、
ひとりで作れるようになることが目標です!
(ちなみに私もここからスタートしました)
今回も最後まで読んでいただきましてありがとうございます!
それでは!
Byerkut.
┌┬─────┬─────────────────────────┬┐
││ あとがき │ 発行者のつぶやきです ││
└┴─────┴─────────────────────────┴┘
私はホラーがダメでバイオハザードをプレイしたことがないのですが、
この間、某巨大掲示板のネタで「幼女ハザードだったら怖くない」
という話がありました。
要は、相手がゾンビじゃなければ怖くないでしょ?ということです。
「確かに」と思ったので、早速作ってみようと思ったのですが、
2D と 3D の融合って結構難しいですね。
バイオハザードは、恐怖感の演出という理由から、
カメラアングルが固定なのですが、これが意外と大変です。
背景は 2D なのに、キャラクターとの奥行きを判定したり、
DirectX ではZバッファが自動的にやってくれることを
自分で構築せねばならず、面倒だったので手が止まっています。
やはり「〜ハザード」の名を冠すのならば
2D と 3D が融合しないといけませんよね。
…と、思ったら最近のバイオハザードはフル 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.


