ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » 移动与游戏开发 » SRGP进行类网页游戏开发(C+lua)(一:设备初始化)

新一届的微软MVP评选已经开始,欢迎各位推荐!

标题: SRGP进行类网页游戏开发(C+lua)(一:设备初始化)
离线 li9416



精华贴数 0
个人空间 0
技术积分 72 (21687)
社区积分 0 (1825009)
注册日期 2008-7-14
论坛徽章:0
      
      

发表于 2008-8-31 18:25 
SRGP进行类网页游戏开发(C+lua)(一:设备初始化)

SRGP是星河工作室开发的2D渲染引擎,对渲染设备、图片、GUI、Tile地图等进行了较高层次的封装。客户端采用ActiveX技术,可方便用于网页游戏的开发。SRGP可以采用C语言开发游戏;同时采用lua作为客户端脚本,起到类似javascript或者vbscript的功能。Lua小巧,高效,完全可以作为客户端脚本,服务器端创建,由SRGP自动下载到客户端中,在客户端本地执行。
        Python有很多扩展库,开发应用很方便;但是用C/C++语言进行服务器端开发,更加灵活和高效。关于一些概念和安装方法,参见SRGP进行类网页游戏开发(Python+lua)

一:导出头文件

        运行ProgramAssist,双击Service后面的编辑框,在弹出的对话框中,双击服务路径后面的编辑框,选择装载的服务:SRPRenderEngine。如果采用默认安装在C盘,则选择“\Documents and Settings\currentuser\local settings\application data\SRPLAB\Server\Service\service\SRPRenderEngine\SRPRenderEngine.scp”
        选择按钮“导出头文件”,选择导出的目录,则对应服务“SRPRenderEngine”的相关头文件被导出到该目录下。生成的.cpp源文件,需要加入到工程中。

二:创建服务器端工程

        用VC++,创建一个控制台工程,在工程中加入上面生成的源文件:SRPFSEngine_UUIDDef.cpp;SRPFSEngine_VSClass.cpp;SRPRenderEngine_UUIDDef.cpp;和SRPRenderEngine_VSClass.cpp。同时加入srplib_vcm.lib库文件,该文件在SRGPServer安装路径的Files目录下面。

1.        SRP平台初始化
装载动态库:
    hDllInstance = ::LoadLibrary( "srpsdll.dll" );
        if( hDllInstance == NULL )
                return 0;
    获取平台回调函数接口
RegisterCallBackInfoProc = (VSServer_RegisterCallBackInfoProc)GetProcAddress( hDllInstance, VSSERVER_REGISTERCALLBACKINFO_NAME );
获取初始化函数
VSInitProc = (VSServer_InitProc)GetProcAddress( hDllInstance, VSSERVER_INIT_NAME );
获取结束函数
VSTermProc = (VSServer_TermProc)GetProcAddress( hDllInstance, VSSERVER_TERM_NAME );
获取BasicInterface接口查询接口
QueryBasicInterfaceProc = (VSServer_QueryBasicInterfaceProc)GetProcAddress( hDllInstance, VSSERVER_QUERYBASICINTERFACE_NAME );
获取ControlInterface接口查询接口
        QueryControlInterfaceProc = (VSServer_QueryControlInterfaceProc)GetProcAddress( hDllInstance, VSSERVER_QUERYCONTROLINTERFACE_NAME );
        注册回调函数,在回调函数中,显示一些信息
RegisterCallBackInfoProc( VSServer_MsgCallBack, 0 );
初始化SRP平台,服务器端侦听端口为3008
    if( VSInitProc( true, true, "", 0, "", 3008) != 0 ){
                printf("srpsdll init error,maybe port has used....\n");
        ::FreeLibrary( hDllInstance );
        return 0;
    }
    获取BasicInterface和ControlInterface接口
    BasicSRPInterface = QueryBasicInterfaceProc();
        SRPControlInterface = QueryControlInterfaceProc();

        其中,如果不需要显示一些平台的消息,则回调函数可以不注册。这里回调函数如下:
unsigned long VSServer_MsgCallBack(unsigned long ServiceGroupID, unsigned long uMsg, unsigned long wParam, unsigned long lParam, VS_BOOL &IsProcessed, VS_ULONG Para )
{
    switch( uMsg ){
    case MSG_DISPMSG :
    case MSG_DISPLUAMSG :   
                printf(  "%s\n", (char *)wParam );
        IsProcessed = true;
        break;
    }
    return 0;
}

2.        创建游戏服务

导入SRPRenderEngine服务
    BasicSRPInterface -> ImportService( "SRPRenderEngine", VS_TRUE );
        BasicSRPInterface -> StringToUuid("842B9A70-0E1D-484a-9337-0D6349392051",&ServiceID);
    创建DeviceInitDemo服务
        BasicSRPInterface -> CreateService("","DeviceInitDemo", &ServiceID, "123",5,0,0,0 );
    获取新创建的服务接口
        SRPInterface = BasicSRPInterface -> GetSRPInterface( "DeviceInitDemo", "root", "123" );
    if( SRPInterface != NULL ){
        SRPInterface -> Print( "Test Ok" );
    }else{
                BasicSRPInterface -> Release();
                SRPControlInterface -> Release();
        ::FreeLibrary( hDllInstance );
        return false;
        }

3.        创建游戏场景
创建游戏场景”test”
        SRPInterface -> CreateSysRootItem( "Test",NULL,NULL,NULL ) ;
    激活该游戏场景
        SRPInterface ->ActiveAllSysRootItem();
        获取游戏场景对象
        SrvItemObject = SRPInterface -> GetSysRootItem( "Test" ) ;
4.        处理客户接入
客户接入函数,通过RegClientMachineProcess注册给平台,如下,
SRPInterface -> RegClientMachineProcess(VS_ClientMachineProcess,NULL,0);
接入函数处理如下:
VS_BOOL VS_ClientMachineProcess(void *Machine,void *Object,DWORD Para, DWORD uMes,VS_UUID *SrcServiceID, DWORD SrcServiceAdd,unsigned short int SrcServicePort,class ClassOfSRPParaPackageInterface *ParaPkg)
{
        SRPInterface -> Print("Client Login");
    switch( uMes ){
        case VS_CLIENT_LOGIN :
     如果是客户端登录,则调用ClientInitOk接受该客户端
SRPInterface -> ClientInitOk( Machine, true, NULL, NULL,0 ); break;
        case VS_CLIENT_LOADSERVICEOK :
     如果客户端完成服务的装载,则在客户端初始化场景”test”
                SRPInterface -> ActiveCSysRootItem( SRPInterface -> GetMachineID(Machine), "Test" );
                break;
        }
        return VS_TRUE;
}

5.        服务器端消息循环
        while ( true ){
                判断是否有键按下,如果有,则退出。
                if( kbhit() != 0 )
                        break;
                消息分发
                if( SRPControlInterface -> SRPDispatch(false) == false )
                        如果没有消息,则处理Idle过程。
                        SRPControlInterface -> SRPIdle();
        }
6.        创建全局对象
创建场景”test”的一个全局对象
        InitObj = SRPInterface -> MallocGlobalObject(SrvItemObject,0,NULL,0,NULL,0);
        创建该对象的_OnActivate脚本,该脚本为客户端脚本,采用Lua语言实现;完成客户端Dx设备的初始化
        SRPInterface -> CreateNameScript(InitObj,"_OnActivate","\
                        function _OnActivate( self, Event )\n\
                if self._Service._ServiceGroup:_IsClient() == false then\n\
                    return --不是客户端,则返回,不进行任何动作\n\
                end\n\
                Device=self._Service.DeviceFaceClass:_New()\n\
                Device.Width=640\n\
                Device.Height=480\n\
                Device.Color = 16711680\n\
                Device:_Active()  \n\
            end\n\
                        "
                );
        设置该全局对象激活方式,为跟随场景激活;该对象激活之后,"_OnActivate"会被调用。
        SRPInterface -> ActiveCmd(InitObj,VSACTIVE_FOLLOW);

三:示例下载

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


只看该作者    顶部
离线 Sky-Tiger
天王盖地虎


来自 Vancouver
精华贴数 39
个人空间 0
技术积分 164608 (3)
社区积分 47285 (15)
注册日期 2004-2-19
论坛徽章:293
现任管理团队成员ITPUB长老会成员Heart of PUB管理团队2007贡献徽章管理团队2006纪念徽章会员2007贡献徽章
会员2006贡献徽章开发板块每日发贴之星开发板块每日发贴之星生肖徽章2007版:蛇开发板块每日发贴之星开发板块每日发贴之星

发表于 2008-9-8 23:47 
GOOD!


__________________
-----孰能浊以静之徐清  孰能安以动之徐生-----  
-----风来疏竹  风过而竹不留声;雁照寒塘  雁去而塘不留影; 故君子事来而心始现  事去而心随空----

----------------
Groovy 研究中...
JAX-WS20(finished)/CXF/ESB/BPEL 研究中...
EJB3(finished)/Hibernate3 研究中...
OSGI/KnopflerFish 研究中...
JBOSS Seam2.0/JSF/AJAX(finished)/ICEFace/ZKoss/Flex3 研究中...
Mysql 研究中...
Spring2.5  研究中...
Blog/Wiki/RSS/ATOM 研究中...
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问