转载请注明,原文地址:http://www.benmutou.com/archives/2495 文章来源:笨木头与游戏开发
protected override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);
GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
m_StartGame = false;
GameEntry.UI.OpenUIForm(UIFormId.MenuForm, this);
}
因为UI模块的OpenUIForm的第一个参数需要一个int类型,而StarForce项目里给UI定的id值是一个枚举类型。这个扩展函数只不过是把枚举转换为int。
关于打开菜单这一步操作,主要有两个地方要关注,分别是uiFormId和userData。打开UI也是框架的基础功能之一(UI模块),打开UI的方式倒是很容易接受,传入UI的唯一
id(自定义的值,int类型)。
不过,这里的OpenUIForm函数并不是框架底层函数,而是StarForce封装过的扩展函数。
但是,目前我们只需要知道可以这样打开UI就好,以后专门研究UI模块的时候再和大家分享。
另外,还有第二个参数,这是一个自定义数据,在UI成功打开时,会触发UI打开成功事件(就是我们之前订阅的那个)。
触发事件时,会传递一个数据过来,这个数据就是我们在OpenUIForm里传递进去的userData。
说的简单点的话,就是,我们事先传进去一个值,事件发生时,再把这个值传回给我们。
在某些情况下很有用,但先不管。
private void OnOpenUIFormSuccess(object sender, GameEventArgs e)
{
OpenUIFormSuccessEventArgs ne = (OpenUIFormSuccessEventArgs)e;
if (ne.UserData != this)
{
return;
}
m_MenuForm = (MenuForm)ne.UIForm.Logic;
}
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
if (m_StartGame)
{
procedureOwner.SetData<VarInt>(Constant.ProcedureData.NextSceneId, (int)SceneId.Main);
procedureOwner.SetData<VarInt>(Constant.ProcedureData.GameMode, (int)GameMode.Survival);
ChangeState<ProcedureChangeScene>(procedureOwner);
}
}
protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
{
base.OnLeave(procedureOwner, isShutdown);
GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
if (m_MenuForm != null)
{
m_MenuForm.Close(isShutdown);
m_MenuForm = null;
}
}