====== Costco Man Siv3Dをつくろう(前準備) ====== まず、用意してほしいもの\\ * スライドパズルの時にやった、タイトル画面~クリア画面の遷移までのプログラム * タイルグラフィック用の画像([[https://kenney.nl/assets/sokoban|フリーのもの]]を使います。[[https://kenney.nl/assets/sokoban|ここ]]からKennyに敬意を払ってダウンロード) * {{game-engineer:classes:2023:something-else:summertime-special-cource:images.zip|ダウンロードとかファイルの選別とかいろいろめんどくさい人は、いったん僕が作った画像}} * やる気とPCと脳みそ🧠 ==== ひな形:タイトル~クリアまで ==== とりあえずいつも通りに、プロジェクト作成=>ひな形の作成までやろう。\\ ここはもう、説明は端折るけども、折角なのでファイルを分けながら書いていくぅ\\ - globals.h * 全体で使う構造体や定数を宣言(重複に注意) - gameSequence.h * ゲームの進行と、ゲーム内容に関する変数や関数の宣言を書く - gameSequence.cpp * ゲームの進行と、ゲーム内容に関する関数の定義を書く - Main.cpp * 上のヘッダたちに宣言したものを使ってゲームを制御する! - stages.h * 全ステージのマップを書いてincludeすることでステージデータを読み込む(今すぐは使わないので後で作るよ) * 後々ファイル読み込みとかを習ったら、データファイルを読み込むようにする。 * 今回は、ちょっとさぼってincludeファイルにデータを書いちゃう - その他自動で作られるものがあるけど、触らないし、無視 === クリックでシーン移動のソースコード === globals.hの中身 //グローバル変数を定義するためのヘッダ enum GAME_STATE { TITLE, PLAY, CLEAR }; とりあえず、グローバルとしてほしいのはゲームステートの皆さん\\ 今のところ、TITLE,PLAY,CLEARを設定しておこうかな。\\ ところでenumの使い方はもう慣れたよね?\\ gameSequence.hの中身 void UpdateTitle(GAME_STATE& _state); void DrawTitle(); void UpdatePlay(GAME_STATE& _state); void DrawPlay(); void UpdateClear(GAME_STATE& _state); void DrawClear(); ゲームのシーケンス(場面転換などの流れ)を制御する関数と、各場面(以下シーン)を描画する描画関数のプロトタイプ宣言。\\ 各Update関数はゲームステートを変更するので、&引数(参照渡し)で引数にしておく\\ gameSequence.cppの中身 #include "globals.h" #include "gameSequence.h" void UpdateTitle(GAME_STATE& _state) { if (MouseL.down()) { _state = GAME_STATE::PLAY; } } void DrawTitle() { Scene::SetBackground(Palette::Black); FontAsset(U"font")(U"TITLE_SCENE").drawAt(Scene::Center()); } void UpdatePlay(GAME_STATE& _state) { if (MouseL.down()) { _state = GAME_STATE::CLEAR; } } void DrawPlay() { Scene::SetBackground(Palette::Black); FontAsset(U"font")(U"PLAY_SCENE").drawAt(Scene::Center()); } void UpdateClear(GAME_STATE& _state) { if (MouseL.down()) { _state = GAME_STATE::TITLE; } } void DrawClear() { Scene::SetBackground(Palette::Black); FontAsset(U"font")(U"CLEAR_SCENE").drawAt(Scene::Center()); } 各アップデート関数では、キー入力やクリック入力の受付と座標や移動の更新などを行う。\\ 各ドロー関数では、描画処理のみを行う\\ Main.cppの中身 # include // OpenSiv3D v0.6.10 #include "globals.h" #include "gameSequence.h" GAME_STATE gState = GAME_STATE::TITLE; void Main() { //自由に拡大縮小できるフォント FontAsset::Register(U"font", FontMethod::MSDF, 30, Typeface::Regular); while (System::Update()) { switch (gState) { case GAME_STATE::TITLE:             タイトルのアップデート             タイトルの描画 break; case GAME_STATE::PLAY:             プレイ画面のアップデート             プレイ画面の描画 break; case GAME_STATE::CLEAR:             クリア画面のアップデート             プレイ画面の描画 break; default: break; } } } Mainはもういいよね?書いてみよう。\\ 実行結果も前にやった通りなので省略ね。\\ ;#; [[game-engineer:classes:2023:something-else:summertime-special-cource:costcoman-siv3d-2|その2 画像読み込み へ]] ;#;