游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2036|回复: 1

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

[复制链接]

17

主题

22

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2008-8-4 22:35:00 | 显示全部楼层 |阅读模式
SRGP进行类网页游戏开发(Python+lua)(一:设备初始化)

        SRGP是星河工作室开发的2D渲染引擎,对渲染设备、图片、GUI、Tile地图等进行了较高层次的封装。客户端采用ActiveX技术,可方便用于网页游戏的开发。Python是目前比较流行的脚本语言,其本身不支持游戏方面的功能,需要使用扩展库。SRGP可以作为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.2.50.1.cab#VERSION=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  其次打开浏览器,装入测试页面

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-8-5 09:14:00 | 显示全部楼层

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

广告?对网页游戏不熟,不过用ActiveX的话和普通网游应该会比较类似吧。有多少玩家用IE且会安装ActiveX呢?有没有统计数据啊?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-14 14:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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