目标:
- 实现儿时的红白机游戏坦克大战操作的那种爽快感
- 实现两人(多人)在不同的电脑上进行战斗操作(移动及发射子弹)的同步,非局域网
即时战斗游戏需要大量的CS交互,这会大大增加服务器开销成本。而这类游戏又无法用P2P实现,在关键点,比如子弹击中的那一刻,各自客户端的判定会有误差。
以下是我的思考过程:
首先我将用户操作的爽快感放在第一位,这就涉及到我必须在用户按下按键的第一时间执行坦克的移动及发射,而坦克大战这款游戏,大家知道有时候最爽的就是开墙,也就是对着砖头墙一边扫一边走。有时候又会与对方的多部坦克进行拼子弹的行为。类似速率极高的行为,如果进行服务器同步呢?如果设定每颗子弹必须相隔0.5秒或1秒发出,这就不是坦克大战了,因为用户玩的不爽!
这确实是一个难题,我参考了很多资料也一无所获,我还特地研究了目前已经在运营的坦克大战ONLINE,游戏画面很不错,功能也很完整,但是玩家不多,聊天频道半天没人说话。我进去体验了几把战斗,我认为最大的问题还在于战斗的流畅性及爽快感(当然,这是与红白机的坦克大战比较的)。游戏中坦克总是慢慢的移动、子弹也有一定的间隔发射时间。调转方向的时候会有转弯的动画播放,此时会停顿。而红白机上的就直接转过去开始移动了。可以看出这很多设定都是为了实现服务器同步以及考虑到服务器成本而做的让步。游戏开发人员不会允许你每几十微秒就向服务器发送信息,然后服务器又会每几十微秒向所有的参与的客户端发送信息(包括其他玩家的信息以及NPC坦克的信息)。这样可以实现游戏的流畅性,可是服务器会很快崩溃的不是么。除非你有雄厚的资金。
需要尽量的减少CS的交互,需要做很多妥协。可是我不想让玩家感觉到停顿和不流畅。我就是要实现红白机上坦克大战的效果。
就移动问题来说,玩家坦克的移动在单机游戏中是每帧进行更新的,就我正在测试的游戏地图来说,移动速度为2,即每帧移动2个像素。我尝试过设置最小的一次移动距离为20像素,这样在我进行一次移动操作后,其他玩家有时间可以收到我的移动请求,并在本地客户端中做延时隐藏(不展开),以保证所有玩家客户端上的画面保持同步。但测试后,发现这样做,玩家操作不爽。砍掉。
然后我做了妥协,玩家本地还是以帧频来更新移动,与服务器的同步采用IAMHERE方法,即每隔0.5秒向服务器发送坦克位置信息。这样另一个玩家收到你的信息一定会有至少0.5秒的滞后,但是这是副本游戏,不是对战游戏,我假定他不CARE.
敌方坦克的移动,采用之前的方法,设定最小移动距离,由服务器每0.25秒广播给参与玩家,但这样服务器发送的数据量还是很大啊。我甚至考虑过敌方坦克的AI放在客户端上,不考虑玩家的作弊问题,然后由服务器初始化敌方坦克的AI随机量,来保证参与玩家画面的同步,但是FLASH游戏,每人帧速有快有慢,这始终无法保持双方画面的同步,更别提加上子弹发射了。
再考虑子弹的发射,我发觉越来越接近无解了。这个发射间隔定在什么时候好呢?另外,对于摧毁建筑物的判定是由服务器来判定还是由客户端来判定呢?正常来说,这种判定应该放在服务端,然后由服务端进行广播,可是这样开墙就不爽了!会停顿。
继续聊子弹,就玩家坦克来说,应该只要有发射就立即通知服务器,让服务器广播给所有参与者。可是玩家在开墙的时候,子弹发射的速率接近“光速“啊。。。这是要让我刷爆服务器么,所以我考虑子弹发射以及打掉建筑物的判定由客户端判定(作弊者就先不考虑了),然后每隔0.25秒,将玩家本身坦克还激活状态中的子弹和位置以及玩家本人打掉的建筑物及敌方坦克及敌方子弹信息(可以拼子弹)一起发送给服务器来同步给其他玩家。
================================================================
看到这里的童鞋不容易。。。和我一起纠结了那么久。呵呵。最终我发现,在现有服务器成本下,我无法实现最初定下的目标。我果断了改变了方案,以另一种游戏模式来进行副本及对战。纠结了3,4天,终于解脱了。
我做游戏的宗旨就是,玩家操作一定要爽,这放在首位。
如果有哪位高人有办法实现我的原定目标,请给予指点,不胜感激!也欢迎各位进行讨论。