Costco Man Siv3Dをつくろう(前準備)
まず、用意してほしいもの
- スライドパズルの時にやった、タイトル画面~クリア画面の遷移までのプログラム
- やる気とPCと脳みそ🧠
ひな形:タイトル~クリアまで
とりあえずいつも通りに、プロジェクト作成⇒ひな形の作成までやろう。
ここはもう、説明は端折るけども、折角なのでファイルを分けながら書いていくぅ
- globals.h
- 全体で使う構造体や定数を宣言(重複に注意)
- gameSequence.h
- ゲームの進行と、ゲーム内容に関する変数や関数の宣言を書く
- gameSequence.cpp
- ゲームの進行と、ゲーム内容に関する関数の定義を書く
- Main.cpp
- 上のヘッダたちに宣言したものを使ってゲームを制御する!
- stages.h
- 全ステージのマップを書いてincludeすることでステージデータを読み込む(今すぐは使わないので後で作るよ)
- 後々ファイル読み込みとかを習ったら、データファイルを読み込むようにする。
- 今回は、ちょっとさぼってincludeファイルにデータを書いちゃう
- その他自動で作られるものがあるけど、触らないし、無視
クリックでシーン移動のソースコード
Listing. 1: globals.hの中身
- globals.h
//グローバル変数を定義するためのヘッダ enum GAME_STATE { TITLE, PLAY, CLEAR };
とりあえず、グローバルとしてほしいのはゲームステートの皆さん
今のところ、TITLE,PLAY,CLEARを設定しておこうかな。
ところでenumの使い方はもう慣れたよね?
Listing. 2: gameSequence.hの中身
- gameSequence.h
void UpdateTitle(GAME_STATE& _state); void DrawTitle(); void UpdatePlay(GAME_STATE& _state); void DrawPlay(); void UpdateClear(GAME_STATE& _state); void DrawClear();
ゲームのシーケンス(場面転換などの流れ)を制御する関数と、各場面(以下シーン)を描画する描画関数のプロトタイプ宣言。
各Update関数はゲームステートを変更するので、&引数(参照渡し)で引数にしておく
Listing. 3: gameSequence.cppの中身
- 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()); }
各アップデート関数では、キー入力やクリック入力の受付と座標や移動の更新などを行う。
各ドロー関数では、描画処理のみを行う
Listing. 4: Main.cppの中身
- Main.cpp
# include <Siv3D.hpp> // 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はもういいよね?書いてみよう。
実行結果も前にやった通りなので省略ね。