コンテンツにスキップ

PrometeApp

PrometeAppは、Prometeアプリケーションの中心となるクラスです。アプリケーションの初期化、プラグインの管理、シーンの制御などを担当します。

PrometeAppはPrometeApp.Create()メソッドを使用してビルダーパターンで作成します。

var app = PrometeApp.Create()
.Use<Keyboard>()
.Use<Mouse>()
.Use<ConsoleLayer>()
.BuildWithOpenGLDesktop();
  1. Create() - ビルダーインスタンスを作成
  2. Use<T>() - プラグインを追加(必要な数だけチェーン)
  3. BuildWith…() - プラットフォーム固有のバックエンドでビルド
// ウィンドウオプション付き
var app = PrometeApp.Create()
.Use<Keyboard>()
.Use<Mouse>()
.Use<ConsoleLayer>(WindowOptions.Default with
{
Title = "My Game",
Size = (800, 600),
Mode = WindowMode.Resizable,
});

アプリケーションをビルドした後、Run<T>()メソッドでシーンを指定して実行します。

// 基本的な実行
return app.Run<MainScene>();

Runメソッドは、アプリケーションが終了するまでブロックし、終了ステータスコード(int)を返します。

アプリケーション構築時にUse<T>()メソッドでプラグインを追加します。

var app = PrometeApp.Create()
.Use<Keyboard>() // キーボード入力
.Use<Mouse>() // マウス入力
.Use<Gamepads>() // ゲームパッド入力
.Use<ConsoleLayer>() // デバッグ用テキスト表示
.Use<CoroutineManager>() // コルーチン管理
.Use<AudioPlayer>() // オーディオ再生
.BuildWithOpenGLDesktop();

実行時にプラグインのインスタンスを取得できます。

// プラグインを取得(存在しない場合は例外)
var keyboard = app.GetPlugin<Keyboard>();
// プラグインの取得を試行(安全)
if (app.TryGetPlugin<Mouse>(out var mouse))
{
// マウスプラグインが利用可能
var position = mouse.Position;
}

アプリケーション実行中にシーンを切り替えることができます。

public class GameScene : Scene
{
private readonly Keyboard _keyboard;
public GameScene(Keyboard keyboard)
{
_keyboard = keyboard;
}
public override void OnUpdate()
{
if (_keyboard.Escape.IsKeyDown)
{
// メニューシーンに切り替え
App.LoadScene<MenuScene>();
}
}
}

シーンをスタック形式で管理することも可能です。

// 現在のシーンを保持した状態で、別のシーンへ遷移
App.PushScene<PauseMenuScene>();
// PauseMenuScene を破棄し、前のシーンに戻る
App.PopScene();

ここに追加したノードは、すべてのシーンの前面または背面に描画され、シーンの切り替えによって削除されません。

Fpsカウンターや、ゲームを通じて常に表示するUIなどに便利ですが、乱用しないよう効果的に使用してください。

// 背景レイヤー(すべてのシーンの背面に描画)
app.GlobalBackground.Add(new Sprite(backgroundTexture));
// 前景レイヤー(すべてのシーンの前面に描画)
app.GlobalForeground.Add(new Text("FPS: 60").Location(10, 10));
app.BackgroundColor = Color.DarkBlue;
// 正常終了
app.Exit();
// エラーコード付きで終了
app.Exit(1);

Prometeは基本的にシングルスレッドで動作します。メインスレッド以外からPrometeのAPIを呼び出す場合は、NextFrameメソッドを使用してメインスレッドに処理を移譲します。

指定した関数は次のフレームの描画前にエンジンによって呼び出されます。よって、次のフレームに処理を遅らせるためにも使用できます。

// 別スレッドからの処理をメインスレッドで実行
Task.Run(() =>
{
// バックグラウンド処理
var result = HeavyCalculation();
// メインスレッドで結果を反映
app.NextFrame(() =>
{
updateText.Content = $"Result: {result}";
});
});

現在のアプリケーションインスタンス

Section titled “現在のアプリケーションインスタンス”

静的プロパティを使用して、現在実行中のアプリケーションインスタンスにアクセスできます。

var currentApp = PrometeApp.Current;

PrometeAppは、エントリアセンブリ内のすべてのScene派生クラスを自動的に検出し、DIコンテナに登録します。

// これらのクラスは自動的に登録される
public class MainScene : Scene { }
public class GameScene : Scene { }
public class MenuScene : Scene { }
// IgnoredSceneAttributeを使用して登録を除外
[IgnoredScene]
public class DebugScene : Scene { }