背景
当以前开始玩安卓机的时候,就发现Android可以玩以前在红白机玩的游戏,而且可以联机,感觉真的很神奇,加上自己对红白机有特殊的情感,当时就琢磨着什么时候把这个模拟器改成可以在线联机,后来可能是运气吧,恰好找到了模拟器的源代码,于是就开始看源码琢磨,发现好像代码并不是很复杂,底层的模拟器C,C++和汇编代码可以不懂,只需要了解如何在上层调用接口就好。后来做了个聊天软件的项目,发现这个聊天软件服务器软件Openfire,Openfire作为服务端,Smack作为客户端,发送消息,传输文件都可以,可以在这个地方使用。于是就花了一段时间完成了这个联机平台。这个平台的目的是想吸引怀念经典的玩家加入,然后形成一个良好的游戏氛围。
项目解析
截图
1.主界面
2.创建连接
3.游戏中
游戏开始前
游戏联机平台需要由一方通过选择ROM创建连接,然后另一方连接,连接成功后,连接方判断本地是否存在此ROM:1.存在即发送存在消息双方同时开始游戏。2.不存在,发送请求获取ROM的消息。对方收到获取ROM的消息,把ROM发过去,另一端接收完毕,发送接收完毕消息,同时开始游戏。
游戏进行中
两端在帧更新的时候就把键值发送给对方,帧更新是从底层传回来的,实现 ,Emulator.FrameUpdateListener
接口的int onFrameUpdate(int keys)
方法可以监听得到。除了发送键值,服务端还要发送游戏的状态来实现同步,public native boolean saveState(String file)
方法可以将当前游戏状态保存为文件。public native boolean loadState(String file)
可以加载游戏状态文件。游戏状态以文件的方式定时发送,每几秒发送一次就好,不用太频繁。游戏进行中支持发送信号,与联机队友沟通,而发送信号时以Smack普通的文本消息发送。而上文说到的请求,应答消息,键值,均是通过自定义消息体实现。在游戏中还给创建联机的那端实现控制,比如重置游戏,这些消息也是通过自定义消息体实现的。
总结
在这种同步要求很高的情况下,openfire服务器效果并不是很好,不过思路在这里,有空用netty写个服务端的。效果应该会好很多。