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编译运行 其次打开浏览器,装入测试页面