ウィンドウ
Prometeのウィンドウシステムは、IWindowインターフェースを通じてプラットフォームに依存しない統一的なAPIを提供します。OpenGLなどの低レベルな描画APIの詳細は完全に隠蔽されており、開発者は高レベルなAPIのみを使用してゲームを開発できます。
ウィンドウの概念
Prometeにおけるウィンドウは、単なる表示領域以上の役割を持ちます:
- 描画のコンテキスト: すべての描画処理の基盤
- イベントの発生源: 更新、描画、リサイズなどのイベント
- 入力の受け口: キーボードやマウスなどの入力デバイスの管理
- リソース管理: テクスチャやその他のGraphics リソースの作成・管理
ウィンドウへのアクセス
シーンからのアクセス
シーン内ではWindowプロパティを通じてウィンドウにアクセスできます。
public class MyScene : Scene{ public override void OnStart() { // ウィンドウのサイズを取得 var (width, height) = Window.Size;
// ウィンドウのタイトルを変更 Window.Title = "ゲーム開始!";
// デルタタイムを取得 var deltaTime = Window.DeltaTime; }}アプリケーションからのアクセス
PrometeAppからもウィンドウにアクセスできます。
var app = PrometeApp.Current;var window = app.Window;ウィンドウのプロパティ
基本的なプロパティ
// 位置とサイズwindow.Location = new VectorInt(100, 100);window.Size = new VectorInt(800, 600);window.X = 100;window.Y = 100;window.Width = 800;window.Height = 600;
// 実際のデバイス解像度var actualSize = window.ActualSize; // DPIスケーリングを考慮した実際のサイズvar actualWidth = window.ActualWidth;var actualHeight = window.ActualHeight;
// 表示状態window.IsVisible = true;window.IsFocused; // 読み取り専用window.IsFullScreen = false;window.TopMost = false;
// タイトルwindow.Title = "My Promete Game";ウィンドウモード
// ウィンドウモードの設定window.Mode = WindowMode.Resizable; // リサイズ可能window.Mode = WindowMode.Fixed; // 固定サイズwindow.Mode = WindowMode.NoFrame; // フレームなしスケール設定
Prometeでは、ゲーム内の座標系を変更せずにウィンドウの表示サイズを拡大できます。
// ピクセルアート向けの整数倍拡大window.Scale = 1; // 等倍window.Scale = 2; // 2倍window.Scale = 4; // 4倍window.Scale = 8; // 8倍この機能により、320×240のピクセルアートゲームを640×480や1280×960のウィンドウで表示できます。
パフォーマンスと時間管理
フレームレート制御
// FPS目標値の設定window.TargetFps = 60;
// UPS(Updates Per Second)目標値の設定window.TargetUps = 60;
// VSync の有効/無効window.IsVsyncMode = true;
// 時間スケールの調整(スローモーションやファストフォワード)window.TimeScale = 1.0f; // 通常速度window.TimeScale = 0.5f; // 半分の速度window.TimeScale = 2.0f; // 2倍速時間とフレーム情報
// 現在のフレーム情報var deltaTime = window.DeltaTime; // 前フレームからの経過時間var totalTime = window.TotalTime; // ゲーム開始からの経過時間var totalFrame = window.TotalFrame; // 総フレーム数
// パフォーマンス情報var fps = window.FramePerSeconds; // 現在のFPSvar ups = window.UpdatePerSeconds; // 現在のUPS
// タイムスケールの影響を受けない時間var realTime = window.TotalTimeWithoutScale;ウィンドウイベント
ウィンドウは様々なイベントを発生させます。
// ゲームのライフサイクルイベントwindow.Start += OnGameStart;window.Update += OnGameUpdate;window.Render += OnGameRender;window.Destroy += OnGameDestroy;
// 追加のイベントwindow.PreUpdate += OnPreUpdate; // 更新前window.PostUpdate += OnPostUpdate; // 更新後window.Resize += OnWindowResize; // ウィンドウリサイズwindow.FileDropped += OnFileDropped; // ファイルドロップ
void OnGameStart(){ Console.WriteLine("ゲーム開始");}
void OnWindowResize(){ Console.WriteLine($"ウィンドウサイズ変更: {window.Size}");}
void OnFileDropped(FileDroppedEventArgs e){ foreach (var file in e.Files) { Console.WriteLine($"ファイルがドロップされました: {file}"); }}テクスチャファクトリー
ウィンドウは、テクスチャの作成を担当するTextureFactoryを提供します。
// 画像ファイルからテクスチャを作成var texture = window.TextureFactory.Load("assets/player.png");
// 単色のテクスチャを作成var whiteTexture = window.TextureFactory.CreateSolid(Color.White, 32, 32);
// 空のテクスチャを作成var emptyTexture = window.TextureFactory.CreateEmpty(256, 256);スクリーンショット機能
ウィンドウの内容をキャプチャできます。
// スクリーンショットをテクスチャとして取得var screenshotTexture = window.TakeScreenshot();
// スクリーンショットをファイルに保存await window.SaveScreenshotAsync("screenshot.png");描画APIの隠蔽
Prometeのウィンドウシステムでは、OpenGL等の低レベルな描画APIの詳細は完全に隠蔽されています。
他の描画バックエンドに移行したとしても、基本的にゲームコードを変更する必要はありません。
関連項目
- PrometeApp - アプリケーションの初期化
- テクスチャ - テクスチャの管理
- シーン - シーンの基本概念