using System; using System.Collections; using System.Windows.Forms; using Rmake.API.Interfaces; using Rmake.API.Interfaces.Enums; using Rmake.API.Realizations.Parts; using Rmake.Framework.Logging; using Rmake.GameRendering; using Rmake.Model; using Rmake.Model.Engine; namespace Rmake.API.Realizations { /// /// GameController の概要の説明です。 /// public class GameController { private Control renderTarget = null; public Control RenderTarget { get {return renderTarget;} set {renderTarget = value;} } private bool isExit = false; private IGamePart currentPart = null; private Hashtable gameParts = null; private PlayingGame game = null; private GameRenderingInitializer gameRenderingInitializer = null; public PlayingGame Game { get { return game; } } public bool IsExit { get {return isExit;} set {isExit = value;} } public GameController(Game game, Control renderTarget) { try { this.renderTarget = renderTarget; // Game の生成 this.game = new PlayingGame(game); gameParts = new Hashtable(); gameParts.Add(GamePartTypes.StartScreen, new StartPart(this)); gameParts.Add(GamePartTypes.Adventure, new AdventurePart(this)); gameParts.Add(GamePartTypes.Field2D, new Field2DPart(this)); // 描画の初期化 gameRenderingInitializer = GameRenderingInitializer.GetInstance(); if (!gameRenderingInitializer.Initialized) { gameRenderingInitializer.Initialize(renderTarget, true); } gameRenderingInitializer.Manager.Width = this.RenderTarget.Width; gameRenderingInitializer.Manager.Height = this.RenderTarget.Height; // 開始画面の開始 ChangeGamePart(GamePartTypes.StartScreen); isExit = false; } catch (Exception ex) { Logger.Fatal(ex); } } /// /// /// /// public bool RunGame() { try { return currentPart.Run(); } catch (Exception ex) { Logger.Fatal(ex.ToString()); } return false; } /// /// Event を現在の GamePart に送信する Method /// /// Event の型 /// Event の Parameter public void SendEvent(MessageTypes eventType, Object parameter) { try { currentPart.ReceiveEvent(eventType, parameter); } catch (Exception ex) { Logger.Fatal(ex.ToString()); } } /// /// ゲームの終了 /// public void FinalizeGameController() { foreach (DictionaryEntry de in gameParts) { IGamePart gamePart = (IGamePart) de.Value; gamePart.FinalizeGamePart(); } } /// /// 現在の GamePart を変更する。 /// Performance を考慮して、変更前の GamePart の FinalizeGamePart() method を呼び出す。 /// /// /// 変更後の GamePart の型 /// /// /// GamePart の変更に成功した場合、true を返す。失敗した場合は false を返す。 /// public bool ChangeGamePart(GamePartTypes gamePartType) { try { if (currentPart != null) { currentPart.FinalizeGamePart(); } IGamePart gamePart = (IGamePart) gameParts[gamePartType]; if (gamePart != null) { gamePart.Initialize(); currentPart = gamePart; return true; } else { return false; } } catch (Exception ex) { Logger.Fatal(ex.ToString()); } return false; } public void RestartGame() { if (currentPart != null) { currentPart.FinalizeGamePart(); currentPart.Initialize(); GC.Collect(); } } /// /// ゲームを保存する /// public void SaveGame() { } /// /// ゲームを読み込む /// public void LoadGame() { } } }