Costco Man Siv3Dをつくろう(前準備)

まず、用意してほしいもの

ひな形:タイトル~クリアまで

とりあえずいつも通りに、プロジェクト作成⇒ひな形の作成までやろう。
ここはもう、説明は端折るけども、折角なのでファイルを分けながら書いていくぅ

  1. globals.h
    • 全体で使う構造体や定数を宣言(重複に注意)
  2. gameSequence.h
    • ゲームの進行と、ゲーム内容に関する変数や関数の宣言を書く
  3. gameSequence.cpp
    • ゲームの進行と、ゲーム内容に関する関数の定義を書く
  4. Main.cpp
    • 上のヘッダたちに宣言したものを使ってゲームを制御する!
  5. stages.h
    • 全ステージのマップを書いてincludeすることでステージデータを読み込む(今すぐは使わないので後で作るよ)
    • 後々ファイル読み込みとかを習ったら、データファイルを読み込むようにする。
    • 今回は、ちょっとさぼってincludeファイルにデータを書いちゃう
  6. その他自動で作られるものがあるけど、触らないし、無視

クリックでシーン移動のソースコード

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はもういいよね?書いてみよう。
実行結果も前にやった通りなので省略ね。

その2 画像読み込み へ