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: 对于您的问题,我会尽力给出答案: SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,支持Windows、Linux和Arm-Linux等多种平台上进行移植。针对不同的平台,需要进行不同的移植和适配工作。 在Windows平台上移植SDL,需要进行以下步骤: 1. 安装Visual Studio开发环境,配置开发环境。 2. 下载SDLWindows版本源码,并解压缩。 3. 在Visual Studio中创建一个新的Win32控制台应用程序,将SDL源码中的include文件夹中的所有文件添加到项目中。 4. 在项目中添加SDL库文件。 5. 在代码中包含SDL头文件,并使用SDL库函数进行开发。 在Linux平台上移植SDL,需要进行以下步骤: 1. 安装Linux开发环境,并配置环境。 2. 下载SDL的Linux版本源码,并解压缩。 3. 运行./configure命令,生成Makefile文件。 4. 运行make命令编译SDL库。 5. 在代码中包含SDL头文件,并使用SDL库函数进行开发。 在Arm-Linux平台上移植SDL,需要进行以下步骤: 1. 安装Arm-Linux交叉编译工具链,并配置环境。 2. 下载SDL的Arm-Linux版本源码,并解压缩。 3. 运行./configure --host=arm-linux命令,生成Makefile文件。 4. 运行make命令交叉编译生成SDL库。 5. 将生成的SDL库和头文件拷贝到Arm-Linux平台上,并在代码中包含SDL头文件,并使用SDL库函数进行开发。 举例来说,如果要在Windows平台上使用SDL库开发一个简单的窗口程序,可以按照以下步骤进行: 1. 在Visual Studio中创建一个新的Win32控制台应用程序。 2. 下载SDLWindows版本源码,并解压缩。 3. 将SDL源码中的include文件夹中的所有文件添加到项目中。 4. 在项目中添加SDL库文件。 5. 在代码中包含SDL头文件,并使用SDL库函数创建一个窗口。 示例代码如下: ``` #include <SDL.h> int main(int argc, char* argv[]) { SDL_Init(SDL_INIT_VIDEO); SDL_Window* window = SDL_CreateWindow("SDL Example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN); SDL_Delay(3000); SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` 以上就是SDLWindows、Linux和Arm-Linux多平台移植差异化分析的步骤和一个简单的示例。 ### 回答2: SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,用于在不同操作系统上开发游戏和多媒体应用程序。在Windows、Linux和Arm-Linux三个平台上进行SDL移植时,需要进行一些差异化分析和具体步骤的处理。下面将详细解释这些步骤,并举几个例子: 1. 平台特定的代码:不同平台上的系统调用和底层库可能具有差异,因此需要编写平台特定的代码。例如,在Windows上使用SDL_DisplayFormat函数创建一个表面,而在Linux上需要使用SDL_CreateRGBSurface函数。 2. 硬件和体系结构差异:不同平台上的硬件和体系结构可能有所不同,需要针对不同的平台进行适配。例如,在Arm-Linux上进行SDL移植时,需要考虑ARM处理器的特性和相关的硬件加速支持。 3. 编译和链接选项:不同平台上的编译器和链接器可能有不同的选项和标志,需要根据具体的平台进行调整。例如,在Windows上使用Visual Studio编译器进行SDL移植,而在Linux上使用GCC编译器。 举例来说,如果在Windows平台上进行SDL移植,需要将平台特定的代码部分包含到源代码中,并使用Visual Studio编译器进行编译。同时,需要注意Windows平台上的系统调用和底层库使用方式。例如,创建一个窗口可以使用SDL_CreateWindow函数,在Windows上使用SDL_WINDOWPOS_CENTERED和SDL_WINDOW_SHOWN参数来居中并显示窗口。 对于Linux平台,需要编写平台特定的代码,并使用GCC编译器进行编译。例如,在Linux上使用SDL_CreateWindow函数时,可以使用SDL_WINDOWPOS_CENTERED和SDL_WINDOWPOS_CENTERED参数来在屏幕中居中并显示窗口。 在Arm-Linux平台上进行SDL移植时,需要适配ARM处理器的特性和硬件加速支持。例如,利用ARM NEON指令集来加速图像处理操作。 总之,进行SDL在不同平台上的移植时,需要考虑平台特定的代码、硬件和体系结构差异以及编译和链接选项等因素,并根据特定平台的要求进行相应的调整和适配。 ### 回答3: 在对SDLWindows、Linux和Arm-Linux多平台移植的差异化分析时,需要考虑以下几个方面的详细步骤,并结合具体的示例进行说明: 1. 平台选择和准备: 根据项目需求和目标平台特性选择合适的平台Windows、Linux或Arm-Linux)。针对所选择的平台,配置开发环境和相应编译器。 2. 编译和链接选项: 不同平台对于编译和链接选项有差异。需要根据目标平台的要求进行相应的设置。例如,对于Windows平台,可能需要设置好正确的编译器(如MSVC,MinGW等)和链接器;对于Linux平台,可能需要添加对应的库文件路径(如"-lSDL2");而Arm-Linux平台则可能需要特定的交叉编译工具链。 3. 处理平台相关的API调用: 不同平台可能有不同的API调用方式和函数名称。需要针对目标平台进行必要的调整。例如,在Windows平台上,窗口创建的函数为"SDL_CreateWindow",而在Linux平台上为"SDL_CreateWindowEx"。 4. 处理平台相关的文件路径: 不同平台对于文件路径的表示方式可能有所不同。需要根据目标平台的要求进行适配。例如,在Windows平台上,文件路径可以使用反斜杠"\"进行表示,而在Linux平台上,需要使用正斜杠"/"。需要注意平台之间的路径分隔符差异。 5. 处理平台相关的输入设备: 不同平台对于输入设备的处理方式也有所不同。需要根据目标平台的要求进行适配。例如,在Windows平台上,可以使用"SDL_GetKeyState"函数来获取键盘状态,而在Linux平台上,可以使用"SDL_PollEvent"函数来获取键盘事件。 举例来说,假设有一个使用SDL开发的游戏,需要在Windows和Linux平台上进行移植。在Windows平台上,可以选择使用MSVC编译器和对应的SDL库进行编译和链接。而在Linux平台上,可以选择使用GCC编译器,并添加对应的SDL库文件路径进行编译和链接。此外,需要对不同平台上的API调用进行适配,例如,针对窗口创建函数,可以使用"SDL_CreateWindow"在Windows平台上创建窗口,而在Linux平台上,则可以使用"SDL_CreateWindowEx"函数。 通过以上的分析和步骤,可以更好地理解和实施SDL在不同平台之间的移植差异化的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值