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()
{
}
}
}