2007年7月5日木曜日

モグラたたきゲーム(2)

前回に引き続き、モグラたたきゲームを「写経」(プログラム手入力)しました。

Microsoft Visual C# は、いわゆるVisual 環境というか統合環境が洗練されていて、「写経」している最中に「スペルミス」を発見してしまいます。また、入力補助機能で想定されるコマンドを選択表示してくれるので、プログラムを入力するのがとても楽です。

何か「写経」の醍醐味が薄れたようで・・・(贅沢!)

ただ、写経の効果は健全で、プログラムを打ち込んでいく内に何をやっているのかが大筋で分かりました。

F5 キーで「デバッグ開始」すると、エラーが4個だけでした。当然、マジックナンバー(100 とか 50 とかの数値)の入力ミスは残っているはずです。


初期画面がオープニングミュージックとともに表示されますが、Xbox360 用コントローラーがないとこれ以上先には進めません。

キーボード操作可能に改造
改造と呼べるほど大げさなものではないのですが・・・

キーボード入力に関するHow to があるのでそれを参考にしました。Microsoft Visual C# 2005 Express Editions のヘルプの中にあります。
[XNA Game Studio Express]-[Programming Guide]-[Input]-[How to: Detect Whether a Key Is Pressed]

ゲーム画面が少しずれていますが、これは私の写経ミス(修行不足)によるものでしょう。


操作方法
「X」キー:Start
「B」キー:Exit
「→」「←」「↑」「↓」キー:照準移動
「A」キー:ハンマー

プログラム修正
修正箇所を以下に列挙します。 修正箇所はかなりありますが、修正内容はどれも簡単で読めばすぐに理解できると思います。基本的に、まずゲームパッド(Xbox360コントローラのこと)に関するコマンドをコメントアウト(行の頭にスラッシュ「/」を2つ追加)し無効にします。次に、そのゲームパッド・コマンドに対応するキーボード・コマンドを追加します。
-------------------------------------------------------------------
Game1 クラスの中
・・・「prevGPState」の宣言をコメントアウト
・・・その下に「prevKBState」の宣言を追加
// private GamePadState prevGPState;
private KeyboardState prevKBState;

・・・「gpState」の宣言をコメントアウト
・・・その下に「kbState」の宣言を追加
// private GamePadState gpState;
private KeyboardState kbState;

Update の中
・・・「gpState」の行をコメントアウトし、「kbState」の行を追加
// gpState = GamePad.GetState(PlayerIndex.One);
kbState = Keyboard.GetState();

UpdateMain の中
・・・バイブレーション設定の行をコメントアウト
// GamePad.SetVibration(PlayerIndex.One, 0.0f, 0.0f);

getInputMain の中
・・・「A」ボタン入力チェックの行をコメントアウト
・・・「A」キー入力チェックの行を追加
// if (gpState.Buttons.A == ButtonState.Pressed &&
// prevGPState.Buttons.A == ButtonState.Released)
if (kbState.IsKeyDown(Keys.A) &&
prevKBState.IsKeyUp(Keys.A))

・・・バイブレーション設定の行をコメントアウト
// GamePad.SetVibration(PlayerIndex.One, 1.0f, 1.0f);

・・・「A」ボタン入力チェックの行をコメントアウトし、「A」キー入力チェックの行を追加
// if (gpState.Buttons.A == ButtonState.Released &&
// prevGPState.Buttons.A == ButtonState.Pressed)
if (kbState.IsKeyUp(Keys.A) &&
prevKBState.IsKeyDown(Keys.A))

・・・バイブレーション設定の行をコメントアウト
// GamePad.SetVibration(PlayerIndex.One, 0.0f, 0.0f);

・・・「左」ボタン入力チェックの行をコメントアウト
・・・「←」キー入力チェックの行を追加
// if (gpState.DPad.Left == ButtonState.Pressed &&
// prevGPState.DPad.Left == ButtonState.Released)
if (kbState.IsKeyDown(Keys.Left) &&
prevKBState.IsKeyUp(Keys.Left))

・・・「右」ボタン入力チェックの行をコメントアウト
・・・「→」キー入力チェックの行を追加
// if (gpState.DPad.Right == ButtonState.Pressed &&
// prevGPState.DPad.Right == ButtonState.Released)
if (kbState.IsKeyDown(Keys.Right) &&
prevKBState.IsKeyUp(Keys.Right))


・・・「上」ボタン入力チェックの行をコメントアウト
・・・「↑」キー入力チェックの行を追加
// if (gpState.DPad.Up == ButtonState.Pressed &&
// prevGPState.DPad.Up == ButtonState.Released)
if (kbState.IsKeyDown(Keys.Up) &&
prevKBState.IsKeyUp(Keys.Up))

・・・「下」ボタン入力チェックの行をコメントアウト
・・・「↓」キー入力チェックの行を追加
// if (gpState.DPad.Down == ButtonState.Pressed &&
// prevGPState.DPad.Down == ButtonState.Released)
if (kbState.IsKeyDown(Keys.Down) &&
prevKBState.IsKeyUp(Keys.Down))


CheckGoMain の中
・・・「B」ボタン入力チェックの行をコメントアウト
・・・「B」キー入力チェックの行を追加
// if (GamePad.GetState(PlayerIndex.One).Buttons.B
// ==ButtonState.Pressed)
if (Keyboard.GetState().IsKeyDown(Keys.B))

・・・「X」ボタン入力チェックの行をコメントアウト
・・・「X」キー入力チェックの行を追加
// if (gpState.Buttons.X==ButtonState.Pressed)
if (kbState.IsKeyDown(Keys.X))
-------------------------------------------------------------------

0 件のコメント: