コンテンツにスキップ

シーン

シーンは、ゲームの画面を表す単位です。多くのゲームは、タイトル画面、ゲーム画面、設定画面、エンディングなど、複数のシーンを持ちます。

Prometeでは、Scene抽象クラスを継承してシーンを作成します。各シーンには独自のライフサイクルがあり、適切なタイミングで初期化、更新、破棄が行われます。

シーンの定義

Sceneクラスを継承してシーンを定義します。

GameScene.cs
using Promete;
using Promete.Input;
public class GameScene(Keyboard keyboard) : Scene
{
public override void OnStart()
{
// シーンが開始されたときの処理
Console.WriteLine("ゲームシーンが開始されました");
}
public override void OnUpdate()
{
// フレーム毎の更新処理
if (keyboard.Escape.IsKeyDown)
{
App.LoadScene<MainScene>();
}
}
public override void OnDestroy()
{
// シーンが破棄されるときの処理
Console.WriteLine("ゲームシーンが終了されました");
}
}

ライフサイクルメソッド

シーンには特定のタイミングで呼び出されるメソッド(ライフサイクルメソッド)があります。

メソッド名呼び出しタイミング用途
OnStart()シーンが開始されたとき初期化処理、リソース読み込み
OnUpdate()フレーム毎ゲームロジック、入力処理
OnDestroy()シーンが破棄されるときリソース解放、クリーンアップ
OnPause()シーンが一時停止されるとき一時停止時の処理
OnResume()シーンが再開されるとき再開時の処理

シーンでの依存性注入

プラグインシステムでも触れていますが、登録したプラグインはコンストラクタ経由でシーンに注入されます。

ExampleScene.cs
using Promete;
using Promete.Audio;
using Promete.Input;
public class ExampleScene(
Keyboard keyboard,
Mouse mouse,
ConsoleLayer console,
AudioPlayer audio) : Scene
{
public override void OnStart()
{
console.Print("シーンが開始されました");
// 各種プラグインやサービスを利用可能
}
public override void OnUpdate()
{
if (keyboard.Space.IsKeyDown)
{
console.Print("スペースキーが押されました");
}
if (mouse[MouseButtonType.Left].IsButtonDown)
{
console.Print($"マウス位置: {mouse.Position}");
}
}
}

ノードの管理

シーンにはRootプロパティがあり、このコンテナにノードを追加することで画面に要素を表示できます。

SpriteScene.cs
using Promete;
using Promete.Graphics;
using Promete.Nodes;
public class SpriteScene : Scene
{
private Texture2D _texture;
private Sprite _sprite;
public override void OnStart()
{
// テクスチャを読み込み
_texture = Window.TextureFactory.Load("assets/player.png");
// スプライトを作成
_sprite = new Sprite(_texture)
.Location(100, 100)
.Scale(2.0f);
// ルートコンテナに追加
Root.Add(_sprite);
}
public override void OnDestroy()
{
// リソースを適切に解放
_texture?.Dispose();
_sprite?.Destroy();
}
}

シーンの切り替え

基本的な切り替え

App.LoadScene<T>() で他のシーンに切り替えます。

// メインシーンに切り替え
App.LoadScene<MainScene>();
// ゲームシーンに切り替え
App.LoadScene<GameScene>();

シーンスタックの利用

シーンスタック機能を使うと、開いたシーンを閉じて元のシーンに戻る、という操作を実現できます。

PushScene<T>()で新しいシーンをスタックに積み、PopScene()で現在のシーンを閉じて前のシーンに戻ります。

// 現在のシーンを保持したまま設定画面を開く
App.PushScene<SettingsScene>();
// 設定画面を閉じて元のシーンに戻る
App.PopScene();

AppとWindowへのアクセス

シーン内部では、現在の PrometeApp IWindow インスタンスにそれぞれ App プロパティ、Window プロパティでアクセスできます。

public override void OnStart()
{
// ウィンドウタイトルを変更
Window.Title = "ゲーム画面";
// ウィンドウサイズを取得
var size = Window.Size;
console.Print($"ウィンドウサイズ: {size.X} x {size.Y}");
}