第一章:多平台支持。
2014打算先写一个游戏框架,然后通过这个框架再写游戏。
本人自学,如有误导,请读者见谅。
想法:
现在的操作系统很多,写一款游戏要在多个平台上运行应该是一个朴素的需求。
本文接下来将介绍如何在 window,wp8,android,mac,ios,linux 上创建一个项目,而游戏代码都是共用的。
除了wp8使用微软的框架外,其他都将集成SDL做开发。
游戏常见的逻辑:
while(true){
doEvent()
show()
}
本实例的实际代码:
int main(int argc, char *argv[]) {
//游戏引擎初始化
int iRet = g_SkComm.init();
if (iRet != 0) {
g_SkComm.log("[%s][%d]g_SkComm.init!=0\n", __FILE__, __LINE__);
exit(0);
}
//显示模块初始化
g_SkShow.init(g_SkComm.getRenderer());
Sint64 siGameBegin = g_SkGameTimer.getGameMTime();
g_SkGameTimer.m_siGameLastTime = siGameBegin;
g_SkGameThread.run(g_SkGameTimer.m_siGameLastTime);
Sint64 siShowBegin = siGameBegin;
//g_SkComm.msleep(3000);
//g_SkComm.myexit();
while (true) {
SkEvent event;
while (g_SkComm.poll_event(&event)) {
g_SkGame.doEvent(&event);
}
Sint64 iCurTime = g_SkGameTimer.getGameMTime();
while (g_SkGameTimer.m_siGameLastTime + g_SkGameTimer.siGameLoopMsec
< iCurTime) {
g_SkGameTimer.m_siGameLastTime += g_SkGameTimer.siGameLoopMsec;
g_SkGameThread.run(g_SkGameTimer.m_siGameLastTime);
}
bool bShow = true;
while (siShowBegin + g_SkGameTimer.siShowLoopMsec < iCurTime) {
siShowBegin += g_SkGameTimer.siShowLoopMsec;
if (bShow) {
g_SkGame.show(&g_SkShow);
g_SkShow.flush();
bShow = false;
}
}
//g_SkComm.log("[%s][%d]\n", __FILE__, __LINE__);
g_SkComm.msleep(SkGameTimer::siGameManLoopMsec);
}
g_SkComm.myexit();
return 0;
}
为了实现平台兼容,我将SDL的调用做了下封装。这样以后不使用SDL,那么游戏代码也是可以复用的。
windows平台的支持:
1.首先用eclipse创建一个android的游戏项目。(可以参看我前面的文章)
2.游戏目录结构如下:
游戏主函数放在 jni\src 目录下
3.创建一个windows目录,用来放在window平台下编译的相关文件。
4.windows 目录下创建一个Makefile文件,类似
INC=-I../jni/src -I../jni/sk_include -I../jni/SDL/include -I../jni/SDL_image -I../jni/SDL_net -I../jni/SDL_ttf
SRC=../jni/src/*.cpp ../jni/sk_src/*.cpp ../jni/sk_game/*.cpp
LIB=-L./lib -lmingw32 -lSDL2_net -lSDL2_mixer -lSDL2_ttf -lSDL2_image -lSDL2 -lSDL2main
all:
g++ -D__SKYPARK_WIN__ -Wall -O2 -o SkyparkGame.exe $(SRC) $(INC) $(LIB)
clean:
rm SkyparkGame.exe
5.下载安装mingw
6.编译运行
7.效果
等多平台都完成了,附上代码。