|
|
该示例为基于SRGP开发的一个简单的飞行射击游戏,包含了控制,声音、碰撞检测。包含单机和网络版本。网络版本可以运行于独立客户端,也可以在浏览器中运行。完整的示例包含三个部分:第一部分服务器端是基于Python开发的;由于脚本语言效率低,因此第二部分谈一下使用C/C++进行部分优化,以及优化的执行代码在客户端,特别是浏览器如何发布;第三部分给出服务器端采用C/C++开发的例子。
本文讲第一部分,之所以选用脚本开发,主要是针对一些小型的游戏,开发过程快,易于维护和修改。采用Python脚本开发服务器端,需要安装预先Python。
示例基于SRGP2.52.1版本,下载示例地址为:
http://www.srplab.com/data/SRGPServer_Inst.2.52.2.rar
http://www.srplab.com/data/SRGPClient_Inst.2.52.2.rar
http://www.srplab.com/data/srppy_inst.2.52.2.rar
示例下载地址为:
http://www.srplab.com/demo/Flight_Demo1.rar
在浏览器中运行,需要注册SRPCActiveX.OCX控件;也可以下载安装包[http://www.srplab.com/data/SRPCActiveX_Inst.2.52.2.rar]安装注册。
1. 单机版运行
Python flight.py
2. 网络版运行
服务器端 python flight.net.py
客户端:使用SRPClient;或者运行IE,打开页面[ClientTest.html]。
下面针对单机版和网络版,做一个简单的介绍:
1. 单机版
a.
游戏采用键盘控制,需要创建键盘对象,处理键按下和抬起事件
KeyObject = Service.KeyInputClass._New()
KeyObject.Enable= True
键盘按下事件
def KeyObject_OnKeyDown(self,Event,nVirtualKey,lKeyData):
根据不同的方向键,设置玩家的移动速度(x方向和y方向),这里调用Player.Move函数
如果是空格键,则设置状态为开火,IsFiring = True
键盘抬起事件:
def KeyObject_OnKeyUp(self,Event,nVirtualKey,lKeyData) :
重新设置玩家的移动速度,或者取消开火。
b.更新子弹,敌人和玩家的位置,重载SpriteClass对象的OnFrameMove函数,该函数每个渲染帧由引擎调用。在该函数中,首先判断是否需要开火;然后更新位置
c.创建一个定时器,定期产生敌人
def PlayerClass_TimerProc(self,TimerID,a1,a2) :
d. 碰撞检测对象PlayerTrigger,检测玩家的子弹是否碰撞敌人;
EnemyTrigger,检测敌人的子弹是否碰撞玩家;
并在重载OnFrameMove函数,每帧进行判断处理
2. 网络版
网络板需要将一些控制放到客户端进行处理,特别是键盘,每帧的刷新,碰撞检测等,并通知服务器端采取相应的动作。这些控制在服务器端定义,需要发布到客户端,需要采用SRGP提供的功能,创建客户端Lua脚本,Lua脚本和Python语法类似。创建调用以下函数XXX._CreateFunc。
a.键盘处理放在客户端,在全局对象InitObj激活过程中初始化,当键按下或者抬起,客户端远程调用服务器端的方法:Player:_RemoteCall(0,"Move",Player.Pos.X,Player.Pos.Y,-0.7*Player.___Speed,-0.7*Player.___Speed)--print( "Left Up")
b. 客户端更新子弹,敌人和玩家的位置,重载SpriteClass对象的OnFrameMove函数,该函数每个渲染帧由引擎调用。在该函数中,首先判断是否需要开火;然后更新位置
c. 服务器端创建定时器,周期创建玩家,保证在多个玩家的时候同步;当服务器端受到客户端的Move调用之后,调用所有客户端上该对象的Move方法,通知所有客户端上该对象的移动速度。
d. 碰撞检测放在客户端,当碰撞之后,调用服务器端的方法self:_RemoteCall(0,"Trigger",Des._ID),服务器端修改对象的生命值。
|
-
|