游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1991|回复: 0

SRGP开发的简单飞行射击游戏(单机+网络,一)

[复制链接]

17

主题

22

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2008-11-9 18:55:00 | 显示全部楼层 |阅读模式
该示例为基于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),服务器端修改对象的生命值。
sf_2008119185447.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 23:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表