我一直在使用迄今为止有效的游戏状态管理示例。我遇到了一个障碍:当Tombstoning,屏幕被序列化;唯一的麻烦是,MessageBoxScreen
有接受和取消的事件处理程序。
序列化这些的最佳方法是什么?我对使用表达式树进行了一些研究,但这对于我想做的事情来说似乎过于复杂。
你如何序列化这些?或者......您使用哪种替代方法来保存包含代理的屏幕的状态?
答案 0 :(得分:1)
我绝对不会尝试序列化类似于lambda的任何东西,或者就此而言,命名方法。请记住:您正在存储州,而不是其他任何内容。
根据您对这些代表的各种分配的范围和范围,您可以通过维护Dictionary<String, WhateverDelagateType>
,序列化密钥并在反序列化后查找回调来实现。
另一件需要考虑的事情 - 我不是专家,但是在线条之间进行阅读听起来好像是在为一个非常临时的模态对话框进行逻辑删除。你真的想要吗?您可能最好将用户带到高分表,或者在他/她返回时跟随对话后的任何内容。
答案 1 :(得分:1)
我决定反对这一点。相反,我坚持游戏流程作为一种“流程图”。
流程图在代码中声明,并具有属性'LastShape'和'LastResultFromShape'。
在我的代码中,我每次都重建流程图定义,如下所示:
flowChart.AddShape( "ShowSplash" );
flowChart.AddLine( "MainMenu", ()=>lastResult=="Clicked" || lastResult=="TimedOut");
flowChart.AddShape( "MainMenu");
flowChart.AddLine( @"ShowOptions", ()=>lastResult=="OptionsClicked");
flowChar.AddLine( @"ShowSplash", ()=>lastResult==@"TimedOut");
etc.etc.
流程从上到下,因此“AddLine”与最后添加的形状有关。
在墓碑化之后,我只是读取最后一个形状和最后一个结果,并根据它确定流程图中的位置。