====== 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 画像読み込み へ]]
;#;