读书人

希望游戏逻辑的一点小疑点

发布时间: 2012-03-03 15:33:03 作者: rapoo

希望高手指点游戏逻辑的一点小问题
我觉得游戏修改为按事件来触发逻辑,才能把单机游戏变成网络游戏。
所以就在考虑这个问题。想到一些,但很多想不明白,希望高手帮忙。
1 增加一个事件队列(谁持有,谁投递,如何处理)
2 持有:Monitor应该有这个事件队列(事件队列应该是一个类,Monitor有这个类,并且可以调用GetDeque取得队列,GetHead取得队列头,SendToDelayDeque发送到延迟队列,等等)
3 投递到队列:输入是消息,消息由各个类自己响应,并根据情况转化为事件,进行投递,因此这个队列必须是个单例。举例:鼠标在某些情况下按,角色没有反映,因为角色内部某些逻辑不允许这个时候进行按键控制,而另一些时候,比如前进,那么要转化为事件,发送到队列,这是因为前进这个动作必须判断是否有碰撞等,而仰头等动作,仅仅在角色内部即可完成,不必转为事件(但好像要其他玩家看见你这个动作,还是要转化为事件)。
4 处理,关于事件的处理函数,应该有很大部分在各个类内部(但这是不是增加了类和消息类之间的耦合程度了,能否用什么办法使得耦合变松散?)
5 将事件转发相应子类,如何让队列的事件转发到子类呢?
(1)可能是各个类先后去看队列,如果这个事件自己能处理(或者是该自己处理),那拿走事件处理去,否则不管,别的类去处理。这里产生了一个问题,有些多个实例的对象,如何确定谁去处理,那么是否应该在产生事件时给明确注明该谁处理?
(2)可能是monitor或者其他什么类,负责分发这些事件到各个类,杂分发?
(3)另外对于一个类可能向自己发送事件,比如时刻t,类a发送一个事件,内容为:3分钟后唤醒我,我现在休息。那么monitor是否应该把这类事件发送到一个延迟队列,然后每针都查看队列里各个事件时间是否到了,到了就投递这个事件到刚才那个类。另外一些情况是类a发送这样一个事件:如果所有的角色都到p点了,通知我。这类事件是否也应该放到延迟队列。
(4)写着上面的,发现一个问题,好像把基本事件和任务逻辑有点杂糅了,那么该如何调整,实现任务逻辑和基础逻辑分开,和简单响应分开,这样,游戏的任务才能无穷增加,才不会C风格化。
6 有些事件的处理会引发网络消息的发送,比如角色姿态改变,运动,比如开火等。

现在重要的问题是,如何实现可以任意添加事件,任意写添加对应事件处理办法,就象window的消息处理办法一样,增加事件和响应不会导致修改之前的东西。这个问题的核心问题是:事件格式是什么,事件产生写在哪里,事件处理写在哪里。(不希望看见超复杂的monitor)


[解决办法]
楼主可以参考一些关于MMORPG设计方面的书籍

好像我在哪里看到过这类书
[解决办法]

探讨
现在重要的问题是,如何实现可以任意添加事件,任意写添加对应事件处理办法,就象window的消息处理办法一样,增加事件和响应不会导致修改之前的东西。这个问题的核心问题是:事件格式是什么,事件产生写在哪里,事件处理写在哪里。(不希望看见超复杂的monitor)

[解决办法]
设计模式问题,用职责链模式就可以,或者策略模式都行,看你习惯用哪种,建议用职责链

读书人网 >网络游戏

热点推荐