課題1ヒント

 課題1の解き方のヒント

設問a

キー入力処理

キーボードの入力によりキャラクタを移動させている処理は Game.cpp の以下の部分である。

// マイキャラ移動処理
if (KeyTbl[VK_LEFT] & 0x80)
    MyChar_x -= MyChar_move;
if (KeyTbl[VK_RIGHT] & 0x80)
    MyChar_x += MyChar_move;

カーソルキーはWindowsで次のような定数が決められている。
左:VK_LEFT
右:VK_RIGHT
上:VK_UP
下:VK_DOWN
今回、上下の移動もさせたいのだからVK_UPVK_DOWNの処理を付け加える。
MyChar_xは現在キャラクタを表示しているX座標を表し、MyChar_moveがキャラクタを一度に移動させる量である。
カーソルの上下によりMyChar_YMyChar_moveを加減算すればよい。

上下の移動判定

左右の壁に当たった時の判定はGame.cpp の以下の部分である。

/* 左右の壁にぶつかったらゲームオーバー */
if (MyChar_x <= GameRect.left || MyChar_x >= GameRect.right-(MyCharRect.right-MyCharRect.left))
{
    g_FrameNo = START_INIT;
}

GameRect.leftがゲーム画面の左端座標を表し、GameRect.rightがゲーム画面右端を表す座標となる。
MyCharRect.leftが表示キャラクタの左端座標を表し、MyCharRect.rightが表示キャラクタの右端を表す座標となる。
(MyCharRect.right-MyCharRect.left)はキャラクタの横幅を求めるための計算で、ゲーム画面の右端からはみ出たかを調べるために行っている。
左右の移動できる範囲は下図のようになる。

今度は上下でも当たり判定を行わなければならないので、GameRect.top GameRect.bottom MyCharRect.top MyCharRect.bottomを使用する。

設問b

キーボードのが押されたかの判定は次の文でできる。

if (KeyTbl['S'] & 0x80)

設問aで終了判定していた文を分解し、左端、右端、上端、下端それぞれを超えたときのif文を作ればよい。
画面の反対側にするにはMyChar_xまたはMyChar_yの値を画面の反対側の座標にすればよい。

設問c

今までの設問ではMyChar_moveで上下左右の移動量が定められている。
今回はX軸方向の移動量とY軸方向の移動量をそれぞれ MyChar_moveXMyChar_moveY の2つの変数を用意しそれに移動量を格納する。
カーソルキーが押されているごとにカーソル移動キーによりMyChar_moveX または MyChar_moveYに1を加減算する。
ただし、設問に最大移動量10とあるので-10以下あるいは+10以上にはならないようにしなければいけない。

設問d

設問Cのプログラムを少し手直しすれば簡単にできる。
設問Cでは左端、右端、上端、下端それぞれを超えたときキャラクタを反対側に表示させるのではなく、キャラクタを画面の一番端の座標にしMyChar_moveX または MyChar_moveYに-1を掛ければ跳ね返る動きをする。