SDL游戏之路(一)--多平台支持--windows

第一章:多平台支持。


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.效果



等多平台都完成了,附上代码。



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include #include //用键盘控制精灵移动 int main(int argc, char ** argv) { SDL_Surface * screen; //主表面 SDL_Surface * image; //用来放MM-----的图片信息(像素) SDL_Surface * PlayerImage; //用来测试的图片 SDL_Event event; Uint32 BeginTicks, EndTicks; SDL_Rect PRect, BRect; //PRect对应精灵的移动的小图位置(实现动画),BRect对应精灵在屏幕的位置。 unsigned char PlayerStarts = 0; unsigned char PlayerIndex = 0; bool bAppRun = true; //初始化SDL if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { fprintf(stderr, "SDL_Init %s\n", SDL_GetError()); return -1; } //初始化成功设置退出要调用的函数SDL_Quit atexit(SDL_Quit); //创建一个640X480 16-bit 模式的主表面 16位可以让MM的效果好看一点 screen = SDL_SetVideoMode(230, 230, 16, SDL_SWSURFACE); if (screen == NULL) { fprintf(stderr, "Couldn't set 640x480x8 video mode %s\n", SDL_GetError()); return -1; } //读取MM图片信息,并创建一个表面,并把数据填入该表面中。 image = SDL_LoadBMP("./mm.bmp"); //请在终端里运行该程序 if (image == NULL) { fprintf(stderr, "Couldn't load MM, %s\n", SDL_GetError()); //遗憾你不能显示MM了,不过你可以用图片浏览程序看。 return -1; } //读取player.bmp PlayerImage = SDL_LoadBMP("./player.bmp"); //请在终端里运行该程序 if (image == NULL) { fprintf(stderr, "Couldn't load MM, %s\n", SDL_GetError()); //遗憾你不能显示MM了,不过你可以用图片浏览程序看。 return -1; } //读取第一个像素 Uint8 key = *((Uint8 *)PlayerImage->pixels); //设置色键 SDL_SetColorKey(PlayerImage, SDL_SRCCOLORKEY, key); //有了MM的表面了,就可以显示了。 //将MM的表面画在我们的主表面上,用MM来作为背景 if (SDL_BlitSurface(image, NULL, screen, NULL) < 0) { //解释一下NULL,第一个是按照image的尺寸显示,第二个是默认显示。你也可以指定大小,不过要用到SDL_Rect你可以看一看帮助。 fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError()); //看看提示吧 return -1; } PRect.x = 0; //初始化动画显示的图片。 PRect.y = 0; PRect.w = 32; PRect.h = 48; BRect.x = 0; //初始化精灵的位置。 BRect.y = 0; BRect.w = 32; BRect.h = 48; //贴上测试用的表面 if (SDL_BlitSurface(PlayerImage, &PRect, screen, &BRect) w, image->h); BeginT
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值