一个SDL的例子分析(二)- 一切从main开始

本文详细分析了一个使用SDL的C代码示例,从main函数开始,逐步解释SDL初始化、设置视频模式、键盘状态获取、消息循环处理等关键步骤,展示了如何构建一个基本的游戏框架。在代码中,SDL_Init初始化视频,SDL_SetVideoMode设置屏幕,SDL_GetKeyState获取键盘状态,SDL_PollEvent处理输入事件,同时探讨了时间管理和帧率控制。
摘要由CSDN通过智能技术生成

由于Pig采用的是C的代码,我们从main开始分析,从SDL的调用过程基本如下步骤:
1.通过SDL_Init初始化SDL
2.通过SDL_SetVideoMode建立主Surface
3.通过SDL_GetKeyState获取键盘状态数组
4.开始消息循环
5.通过SDL_PollEvent获取消息,并处理直到完成

以下是main函数

/*----------------------------------------------------------
 main()
----------------------------------------------------------*/
int main(int argc, char* argv[])
{
 SDL_Surface *screen;
 GAMESTATE *gs;
 int i;
 int bpp = 0;
 int last_tick, start_time, end_time;
 int dashframe;
 float logic_fps = 20.0;
 int flags = SDL_DOUBLEBUF | SDL_HWSURFACE;

 // SDL视频初始化
 SDL_Init(SDL_INIT_VIDEO);

 // 将函数SDL_Quit压入退出处理程序
 atexit(SDL_Quit);

 // 设置中断句柄,设置在Ctrl+Break和程序中止的时候,调用breakhandler
 // 在breakhandler中重新设置了中断处理句柄,并将中断标志设为1
 signal(SIGTERM, breakhandler);
 signal(SIGINT, breakhandler);

 // 处理参数

#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. 下载SDL的Windows版本源码,并解压缩。 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. 下载SDL的Windows版本源码,并解压缩。 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; } ``` 以上就是SDL在Windows、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: 在对SDL在Windows、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在不同平台之间的移植差异化的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值