====== ついに動くCostco Man ======
割とあっさりと、ステージの表示までできたと思う。\\
それってやっぱり、**Console版を一回作って**__**どんな動作をするものを作ろうかというイメージ**__と__**設計**__ができているのが大きいんだよね。\\
つまり、\\
ただ何も書かずに考えて、何もまとめずソースコードそのまま書こうとするやつは、一生ゲーム作れません
何事も、小さなことの積み重ねと、次を考えて行動することが大事ってことだね。\\
それでは次に行ってみよう。\\
次は、実際に荷物押して運べるようにしていこう\\
Console版では、プレイ画面では以下のようにゲームのループを回していた。\\
- Mapの初期化
- Updateで入力受付
- Updateでプレイヤーの位置を取得
- Updateでプレイヤーの移動
- Updateでプレイヤーの移動に伴う荷物の移動の処理
- UpdateでClear判定
- Clearしていたら状態を変更
- それ以外は次へ
- すべて更新し終わったらDraw関数で更新後のStageを表示
- 入力受付に戻る
大体こんな感じだった(と思う)\\
この処理はSiv3Dでも大体同じように書いていくことができる(っていうか、できそうな感じにConsole版書いておいたんだ)\\
しかも、今回のグラフィック表示は、コンソール版のマップをグラフィカルに表示しているだけなので、コンソール版が裏で動いてさえくれれば表示を更新していくだけになる。(とりあえずはね)\\
入力部分は、コンソール版はstdin(標準入力)を使っていたが、Siv3D版ではSiv3Dの機能を使って入力をゲットしていく\\
その辺も含めて、必要な機能をConsole版から移植していこう(ほとんどはコピペで済むYO!)\\
=== ソースを追加していく ===
まずは、宣言部。つまり、gameSequence.hの修正をしていこう\\
gameSequence.hの修正
//Mainから呼ぶやつ
void UpdateTitle(GAME_STATE& _state);
void DrawTitle();
void UpdatePlay(GAME_STATE& _state);
void DrawPlay();
void UpdateClear(GAME_STATE& _state);
void DrawClear();
//Mainからは呼ばず、gameSequenceのほうでだけ呼ぶやつ
void DrawStage(Map& _map);
//ちょっと引数を変えたのでこっちに書く
direction GetDirection();
//Console版から持ってきたやつ
OBJNAME GetObjectNum(Point _pos, Map& _map);
void SetObjtoMap(OBJNAME _obj, Point _pos, Map& _map);
Point GetPlayerPos(Map& _map);
void MoveObject(direction _dir, Map& _map);
bool CheckClear(Map& _map);
実際に入力を受け取る関数GetDirectionの引数はコンソール版ではint cでとってきていたが、関数内でSiv3Dの機能を使って入力を受け取るので引数はいらなくなる\\
その他は、ほとんどそのまま使える(はず)\\
次に、それを踏まえて、定義部(gameSequence.cpp)を修正していく\\
gameSequence.cppの修正
//Mainから呼ぶやつ
void UpdateTitle(GAME_STATE& _state)
から
void DrawClear()
{
}
まで追加なしなので省略
//Mainからは呼ばず、gameSequenceのほうでだけ呼ぶやつ
void DrawStage(Map& _map)
{
変更なしで省略
}
//ちょっと引数を変えたのでこっちに書く
direction GetDirection()
{
//後で直すので省略
}
//Console版から持ってきたやつ
OBJNAME GetObjectNum(Point _pos, Map& _map)
{
//コンソール版そのままコピペ
}
void SetObjtoMap(OBJNAME _obj, Point _pos, Map& _map)
{
//コンソール版そのままでいいよ
}
Point GetPlayerPos(Map& _map)
{
//コンソール版そのまま
}
void MoveObject(direction _dir, Map& _map)
{
//ここだけ変更
Point dirVector[5] =
{
{ 0, -1 },{ -1, 0 },{ 0, +1 },{ +1, 0 },{ 0, 0 }
};
//Console版は、これが外に出ていたが(ほかでも使う気がしてたんだよねぇ)この関数でしか使わないので関数ローカルで宣言
//あとは、コンソール版と同じ!
}
bool CheckClear(Map& _map)
{
//コンソール版と同じでOK
//ここだけ、coutは使わないのでコメントにしておこう(グラフィック表示だもんね)
//cout << "おかたずけ完了!" << endl;
return true;
}
ここまで変更したら、最後に、入力を取得する関数direction GetDirection()を修正していく\\
Siv3D使っているので、キー入力は
* Key○○.Down()
* Key○○.Up()
とかで取得することができる。\\
コンソール版では、アロー(方向)キーの取得がちょいめんどくさかったのでスルーしたけど(できないわけじゃないんだからね)、\\
今回は簡単なので、アローキーでもwasdでも動くようにしよう\\
方向は、globals.hで、\\
//direction方向を表すenum
enum direction
{
UP, LEFT, DOWN, RIGHT, NONE
};
* 'w'または上キー
* direction::UPまたは、単にUPを返す
* 'a'または左キー
* direction::LEFTまたは、単にLEFTを返す
* 's'また下キー
* direction::DOWNまたは、単にDOWNを返す
* 'd'または右キー
* direction::RIGHTまたは、単にRIGHTを返す
[[https://zenn.dev/reputeless/books/siv3d-documentation/viewer/tutorial-keyboard#16.5-%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%AD%E3%83%BC%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B|Siv3Dで複数キーの入力を取得するには、ここを]]見てほしい。\\
GetDirection関数の更新
direction GetDirection()
{
if ('w'または上キー)
{
return UP;
}
else if ('a'または左キー)
{
return LEFT;
}
else if ('s'または下キー)
{
return DOWN;
}
else if ('d'または右キー)
{
return RIGHT;
}
else //その他の場合
return NONE;
}
==== 実際に動かしていく ====
あとは、UpdatePlay内で、GetDirectionを呼び出してプレイヤーの移動方向を取得し、\\
コンソール版のMoveObjectにぶっこんでやればいいと思う。\\
使うマップは、さっきincludeで読み込んだmaps[0]を使おう\\
caption
void UpdatePlay(GAME_STATE& _state)
{
direction nextDir = 方向を取得
MoveObjectを使ってmaps[0]上のプレイヤーをnextDirに動かす!;
//if (MouseL.down())
//{
// _state = GAME_STATE::CLEAR;
//}
}
これで、入力があるとmaps[0]のDat[][]にあるデータが書き換えられるので、DrawPlayでは今まで通り書き換えられたデータをマップ表示すればいいだけである。(変更なし)\\
=== 表示結果 ===
{{game-engineer:classes:2023:something-else:summertime-special-cource:siv3d_app_debug_build_d3d11_144_fps_f_800x600_v_800x600_s_800x600_2023-08-16_20-53-16.mp4?300|結果動画}}
ここまでの結果
;#;
[[game-engineer:classes:2023:something-else:summertime-special-cource:costcoman-siv3d-4|その4 クリア判定とか、その他いろいろ]]
;#;