SRGP进行类网页游戏开发(Python+lua)(一:设备初始化)

软件和网站开发以及相关技术探讨
回复
li9416
帖子: 3
注册时间: 2008-07-12 18:20

SRGP进行类网页游戏开发(Python+lua)(一:设备初始化)

#1

帖子 li9416 » 2008-08-05 20:13

SRGP是星河工作室开发的2D渲染引擎,可以作为Python的一个扩展库,支持使用Python语言开发游戏;同时采用lua作为客户端脚本,起到类似javascript或者vbscript的功能。Lua小巧,高效,完全可以作为客户端脚本,服务器端创建,由SRGP自动下载到客户端中,在客户端本地执行。
本系列文章,介绍在SRGP上开发类网页游戏;大致分为:设备初始化,客户服务器通信,图像显示,文本显示,精灵动画,GUI,Tile地图,与浏览器之间的交互,调试工具等部分。SRGP是基于星河工作室分布式对象平台开发的,因此正文开始在之前,首先介绍几个基本的概念:
1) 对象,也即分布式对象,包含有属性,方法,事件,并可以关联Lua脚本;分为全局对象(服务器端和所有客户端存在),客户对象(服务器端和特定客户端存在),本地对象。
2) 服务,多个对象放到一起,对外提供某些功能,就称为一个服务;比如,游戏渲染引擎是一个服务,包含场景对象,GUI对象,精灵对象等等。一个游戏也可以看作是一个服务。
3) 服务组,一个服务可以依赖于其它服务创建,正如游戏需要依赖于渲染引擎服务。服务及其依赖的服务放在一起,构成一个服务组。
4) 服务项目,游戏中有多个场景,类似的,一个服务也可以分多个服务项目,每个服务项目包含有一个或者多个对象。
5) 对象事件,每个对象都关联了很多系统事件,其中比较重要的是激活和去活,激活之后产生OnActive事件,去活之后产生OnDeactive事件;可以定义对象处理这些事件脚本,以便进行相应的处理。

一:SRGP服务器端安装

1). 安装SRGPServer
下载地址:http://www.srplab.com/SRGPServer_Inst.2.50.1.rar,解压之后双击展开,运行安装程序,按照提示安装即可。
2).安装Python
支持Python版本2.5.2,下载地址:http://www.python.org/ftp/python/2.5.2/python-2.5.2.msi
3).安装SRPPython
下载地址:http://www.srplab.com/srppy_inst.2.50.1.rar,解压之后双击展开,运行安装程序,按照提示安装即可。

二:客户端控件安装

下载地址:http://www.srplab.com/SRPCActiveX_Inst.2.50.1.rar,解压之后双击展开,运行安装程序,按照提示安装即可。
也可以,使用浏览器自动安装,将下面的代码嵌入到页面中:
<SCRIPT language="javaScript">
document.write("<OBJECT ID=SRPCActiveX CLASSID=\"CLSID:5C924217-392E-4354-B011-1DAC6871B686\" HEIGHT=300 WIDTH=400 standby = \"正在下载安装\" VIEWASTEXT ></OBJECT>")
</script>
客户端渲染使用DirectX,需要DirectX9.0C以上的版本支持。
IE安装控件,需要将http://www.srplab.com加入到信任站点,同时将信任站点的安全级别设置成为最低。

三:测试网页

在该系列文章中,客户端测试全部采用如下的页面。在服务器端启动之后,用浏览器打开下面的页面即可,所有编程全部集中在服务器端。

<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<!-- Copyright 2005 Macromedia, Inc. All rights reserved. -->
<title>Lodging - Product Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<link rel="stylesheet" href="mm_lodging1.css" type="text/css" />
</head>
<body>
<SCRIPT language="javaScript">
document.write("<OBJECT ID=SRPCActiveX CLASSID=\"CLSID:5C924217-392E-4354-B011-1DAC6871B686\" CODEBASE=\"http://www.srplab.com/data/srpcactivex. ... N=2.50.0.1\" HEIGHT=480 WIDTH=600 standby = \"正在下载安装\" VIEWASTEXT ></OBJECT>")

function connectserver()
{
SRPCActiveX.GetSrvGroup("SrvGroup")
SRPCActiveX.RunLua("SrvGroup:_Connect(\"\",\"127.0.0.1\",3008,10)")
}
setTimeout( connectserver,10 )

</script>
</body>
</html>

四:设备初始化

(一):导入Python库

使用如下代码:
#coding=gb2312
import sys
import os
sys.path.append( os.getenv('windir')+ "\\system32")
import srpspy
srpspy._InitServer(True,True,False,True, "",0, "",3008)
其中,3008为服务器端的侦听端口,其它参数暂且不管,按照上述取值输入即可。

(二):创建游戏服务
SrvGroup = srpspy._GetSrvGroup()
SrvGroup._ImportService("SRPRenderEngine")
SrvGroup._CreateService( "", "DeviceInitDemo", "123",5,0,0,0, "842B9A70-0E1D-484a-9337-0D6349392051" )
Service = SrvGroup._GetService("root","123")
"123"为"root"用户的口令,
"842B9A70-0E1D-484a-9337-0D6349392051"为创建的游戏的唯一ID,使用Guidgen生成,不同游戏之间不同。
其它参数待以后解释

(三):创建游戏场景(服务项目)

Service._CreateSysRootItem("Test", "")
Service._ActiveAllSysRootItem()
SrvItem = Service._GetSysRootItem("Test")
"Test"为游戏场景名称

(四):处理客户接入

处理客户端接入,需要提供一个Python回调函数给SRGP,格式如下:

def Service_ClientRegisterProc( self, uMes, ClientID, SrcServiceID, SrcServiceAdd, SrcServicePort, ParaPkg ) :
if uMes == 1 :
self._AcceptClient( ClientID, True, True )

if uMes == 2 :
self._ActiveCSysRootItem( ClientID, "Test")

Service._RegMachineFunction(Service_ClientRegisterProc)
函数定义之后,调用_RegMachineFunction注册给SRGP。此后,当有客户端连接之后,该回调函数就被调用。
uMes = 1,表示有客户接入到服务器,服务器调用_AcceptClient允许或者拒绝该客户接入。
uMes = 2,表示有客户已经接入,服务器调用_ActiveCSysRootItem为客户指定一个游戏场景(服务项目)。
uMes = 3,表示有客户退出。

(四):服务器端消息循环

服务器端注册客户接入回调函数之后,就可进入消息循环;等待和处理消息队列中的消息。
def ExitProc() :
if srpspy._KeyPress() == True :
return True
return False
srpspy._MsgLoop( ExitProc )
srpspy._ModuleExit()
在上述消息循环中,如果有按键,则退出服务器端程序。

(五):创建全局对象

完成上述步骤之后,客户端可以正常接入,但是由于客户端不存在任何对象,因此除了能够接入之外,客户端不具有其它任何功能。此时需要为客户端创建对象,该对象在客户端完成Directx设备的初始化。

InitObj = Service._NewGlobal(SrvItem)
在游戏场景"Test"中创建一个全局对象,创建全局对象的Lua嵌入式脚本,处理对象的OnActivate事件。
InitObj._CreateFunc("_OnActivate",r"""
function _OnActivate( self, Event )
if self._Service._ServiceGroup:_IsClient() == false then
return --不是客户端,则返回,不进行任何动作
end
Device=self._Service.DeviceFaceClass:_New()
Device.Width=640
Device.Height=480
Device.Color = 16711680
Device:_Active()
end
""")
首先调用SrvGroup函数,判断脚本是否运行在客户端,如果不是,则返回。
其次,创建一个本地设备对象,设置宽度和高度,然后激活设备对象。设备对象激活之后,自动根据设置的参数,初始化Dx设备。DeviceFaceClass在SRPRenderEngine中定义。

InitObj._ActiveCmd(srpspy.ACTIVE_FOLLOW)
设置该全局对象的激活方式,如上设置为与游戏场景同步激活,当客户端装载了游戏场景之后,则自动激活InitObj,产生该对象的_OnActivate事件,此时判断存在处理脚本,则执行脚本。

五:示例下载

1. 客户端测试网页下载:http://www.srplab.com/demo/clienttest.rar
2. 服务器端Python代码下载:http://www.srplab.com/demo/DeviceInitDemo.rar
运行方法:展开,
首先python DeviceInitDemo.py 其次打开浏览器,装入测试页面
回复