古い2Dゲームの中には、プレイヤーキャラクターが画面端からはみ出した場合、反対側から出てくる仕様のゲームも多くありました。
「パックマン」のワープトンネルなどは代表的なものでしょう。
左右の移動制限を変更して、上記のプログラムを作ってみましょう。
今のところは画面の右端まで移動すると、そこで止まるようになっています。
if (pEngine->GetKeyState(DIK_RIGHT)) { m_direction = RIGHT; m_x += m_speed; if (m_x >= WindowSetting::WINDOW_WIDTH - WIDTH) { m_x = WindowSetting::WINDOW_WIDTH - WIDTH; } } |
やりたい事は「画面の右端からキャラクターが完全に出たら、画面の左端から出てくるようにしたい」です。
「画面の右端からキャラクターが完全に出る」と言う事は、「転送先X座標が640を超える」と言う事です。
「転送先X座標が640を超えたら」画面の左端へキャラクターを移動させれば良いですから、「転送先X座標を0」にしてみます。
if (pEngine->GetKeyState(DIK_RIGHT)) { m_direction = RIGHT; m_x += m_speed; if (m_x >= WindowSetting::WINDOW_WIDTH) { m_x = 0; } } |
実行してみましょう。
右へ移動していくと・・・
スピードが2なので、ここまでは何も起きません。
転送先X座標が640以上になった瞬間に、
画面の左端に「ワープ」しました。
右端からは徐々に画面外に出ているのに、左端から「ぱっ」と出てくるのは違和感があります。
左端から出てくる時も、画面外から出てくるように調整しましょう。
if (pEngine->GetKeyState(DIK_RIGHT)) {
m_direction = RIGHT;
m_x += m_speed;
if (m_x >= WindowSetting::WINDOW_WIDTH) {
m_x = -WIDTH;
}
}
|
実行して確かめてみます。
いきなり画面に「ぱっ」と現れる事が無くなりました。。
同じように左端の処理も作ってみてください。
解答です。
if (pEngine->GetKeyState(DIK_LEFT)) { m_direction = LEFT; m_x -= m_speed; if (m_x < -WIDTH) { m_x = WindowSetting::WINDOW_WIDTH; } } |
実行して確かめてみましょう。
1つの画面でキャラクターを移動させる事を前提にして、移動制限について説明してきました。
しかし、背景がスクロールするなどの要素が入ってくると、移動制限も別の方法を考えなければなりません。
※昔の2DRPGなど、プレイヤーキャラクターは画面の真ん中から動いておらずマップが動いていました。
色々なゲームを参考にして、皆さん自身で試してみてください。