mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
128 lines
4.6 KiB
C#
128 lines
4.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace TEngine
|
|
{
|
|
/// <summary>
|
|
/// 游戏框架入口。
|
|
/// </summary>
|
|
public static class GameFrameworkEntry
|
|
{
|
|
private static readonly GameFrameworkLinkedList<GameFrameworkModule> GameFrameworkModules = new GameFrameworkLinkedList<GameFrameworkModule>();
|
|
|
|
/// <summary>
|
|
/// 所有游戏框架模块轮询。
|
|
/// </summary>
|
|
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
|
|
/// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
|
|
public static void Update(float elapseSeconds, float realElapseSeconds)
|
|
{
|
|
foreach (GameFrameworkModule module in GameFrameworkModules)
|
|
{
|
|
module.Update(elapseSeconds, realElapseSeconds);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 关闭并清理所有游戏框架模块。
|
|
/// </summary>
|
|
public static void Shutdown()
|
|
{
|
|
for (LinkedListNode<GameFrameworkModule> current = GameFrameworkModules.Last; current != null; current = current.Previous)
|
|
{
|
|
current.Value.Shutdown();
|
|
}
|
|
|
|
GameFrameworkModules.Clear();
|
|
MemoryPool.ClearAll();
|
|
Utility.Marshal.FreeCachedHGlobal();
|
|
GameFrameworkLog.SetLogHelper(null);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取游戏框架模块。
|
|
/// </summary>
|
|
/// <typeparam name="T">要获取的游戏框架模块类型。</typeparam>
|
|
/// <returns>要获取的游戏框架模块。</returns>
|
|
/// <remarks>如果要获取的游戏框架模块不存在,则自动创建该游戏框架模块。</remarks>
|
|
public static T GetModule<T>() where T : class
|
|
{
|
|
Type module = typeof(T);
|
|
|
|
if (module.FullName != null && !module.FullName.StartsWith("TEngine.", StringComparison.Ordinal))
|
|
{
|
|
throw new GameFrameworkException(Utility.Text.Format("You must get a Game Framework module, but '{0}' is not.", module.FullName));
|
|
}
|
|
|
|
string moduleName = Utility.Text.Format("{0}.{1}", module.Namespace, module.Name.Substring(1));
|
|
Type moduleType = Type.GetType(moduleName);
|
|
if (moduleType == null)
|
|
{
|
|
moduleName = Utility.Text.Format("{0}.{1}", module.Namespace, module.Name);
|
|
moduleType = Type.GetType(moduleName);
|
|
if (moduleType == null)
|
|
{
|
|
throw new GameFrameworkException(Utility.Text.Format("Can not find Game Framework module type '{0}'.", moduleName));
|
|
}
|
|
}
|
|
|
|
return GetModule(moduleType) as T;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取游戏框架模块。
|
|
/// </summary>
|
|
/// <param name="moduleType">要获取的游戏框架模块类型。</param>
|
|
/// <returns>要获取的游戏框架模块。</returns>
|
|
/// <remarks>如果要获取的游戏框架模块不存在,则自动创建该游戏框架模块。</remarks>
|
|
private static GameFrameworkModule GetModule(Type moduleType)
|
|
{
|
|
foreach (GameFrameworkModule module in GameFrameworkModules)
|
|
{
|
|
if (module.GetType() == moduleType)
|
|
{
|
|
return module;
|
|
}
|
|
}
|
|
|
|
return CreateModule(moduleType);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 创建游戏框架模块。
|
|
/// </summary>
|
|
/// <param name="moduleType">要创建的游戏框架模块类型。</param>
|
|
/// <returns>要创建的游戏框架模块。</returns>
|
|
private static GameFrameworkModule CreateModule(Type moduleType)
|
|
{
|
|
GameFrameworkModule module = (GameFrameworkModule)Activator.CreateInstance(moduleType);
|
|
if (module == null)
|
|
{
|
|
throw new GameFrameworkException(Utility.Text.Format("Can not create module '{0}'.", moduleType.FullName));
|
|
}
|
|
|
|
LinkedListNode<GameFrameworkModule> current = GameFrameworkModules.First;
|
|
while (current != null)
|
|
{
|
|
if (module.Priority > current.Value.Priority)
|
|
{
|
|
break;
|
|
}
|
|
|
|
current = current.Next;
|
|
}
|
|
|
|
if (current != null)
|
|
{
|
|
GameFrameworkModules.AddBefore(current, module);
|
|
}
|
|
else
|
|
{
|
|
GameFrameworkModules.AddLast(module);
|
|
}
|
|
|
|
return module;
|
|
}
|
|
}
|
|
}
|