大部分游戏由5个功能模块组成。
-
初始化(Initialize)
加载数据(纹理,地图,NPCs等) -
事件(Event)
输入事件(鼠标,键盘,游戏手柄等) -
循环(Loop)
数据更新(NPCs在屏幕上移动,血条改变等) -
渲染(Render)
呈现到屏幕上的一切画面。此过程不涉及数据操作,相关操作在Loop里实现。 -
清理(Cleanup)
清理资源加载,确保离开游戏后资源释放。
用代码解释类似于这种
Initialize();
while(true) {
Events();
Loop();
Render();
}
Cleanup();
每一个循环的迭代过程,我们会做一些数据处理,渲染。事件是额外的,它允许用户操作数据的改变。事件有时候是不需要的,比如NPC的行走,这些不需要用户来操作数据的改变,交给程序本身就够了。
if(Key == LEFT) X--;
if(Key == RIGHT) X++;
if(Key == UP) Y--;
if(Key == DOWN) Y++;//... somewhere else in our code ...
RenderImage(KnightImage, X, Y);
这里X和Y代表位置信息,这样就是用户手动操作。
如果我们的程序跑30帧每秒,这段程序会值一秒内执行30遍,对应的改变了30次X或Y的值。
在SDL里SDL_PollEvent来检查事件。
SDL_Event Event;
SDL_PollEvent(&Event);
SDL_Event是一个结构体来保存事件相关信息的。
/**
* \brief General event structure
*/
typedef union SDL_Event
{
Uint32 type; /**< Event type, shared with all events */
SDL_CommonEvent common; /**< Common event data */
SDL_DisplayEvent display; /**< Display event data */
SDL_WindowEvent window; /**< Window event data */
SDL_KeyboardEvent key; /**< Keyboard event data */
SDL_TextEditingEvent edit; /**< Text editing event data */
SDL_TextInputEvent text; /**< Text input event data */
SDL_MouseMotionEvent motion; /**< Mouse motion event data */
SDL_MouseButtonEvent button; /**< Mouse button event data */
SDL_MouseWheelEvent wheel; /**< Mouse wheel event data */
SDL_JoyAxisEvent jaxis; /**< Joystick axis event data */
SDL_JoyBallEvent jball; /**< Joystick ball event data */
SDL_JoyHatEvent jhat; /**< Joystick hat event data */
SDL_JoyButtonEvent jbutton; /**< Joystick button event data */
SDL_JoyDeviceEvent jdevice; /**< Joystick device change event data */
SDL_ControllerAxisEvent caxis; /**< Game Controller axis event data */
SDL_ControllerButtonEvent cbutton; /**< Game Controller button event data */
SDL_ControllerDeviceEvent cdevice; /**< Game Controller device event data */
SDL_ControllerTouchpadEvent ctouchpad; /**< Game Controller touchpad event data */
SDL_ControllerSensorEvent csensor; /**< Game Controller sensor event data */
SDL_AudioDeviceEvent adevice; /**< Audio device event data */
SDL_SensorEvent sensor; /**< Sensor event data */
SDL_QuitEvent quit; /**< Quit request event data */
SDL_UserEvent user; /**< Custom event data */
SDL_SysWMEvent syswm; /**< System dependent window event data */
SDL_TouchFingerEvent tfinger; /**< Touch finger event data */
SDL_MultiGestureEvent mgesture; /**< Gesture event data */
SDL_DollarGestureEvent dgesture; /**< Gesture event data */
SDL_DropEvent drop; /**< Drag and drop event data */
/* This is necessary for ABI compatibility between Visual C++ and GCC
Visual C++ will respect the push pack pragma and use 52 bytes for
this structure, and GCC will use the alignment of the largest datatype
within the union, which is 8 bytes.
So... we'll add padding to force the size to be 56 bytes for both.
*/
Uint8 padding[56];
} SDL_Event;
SDL_PollEvent会在队列里抓取事件,失败返回false。
初始化
if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
printf("Can not sdl_init_video, %s\n", SDL_GetError());
return 1;
}
窗体创建
// Create Window Entity
SDL_Window* win = SDL_CreateWindow("MyWindow", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
if (win == NULL)
{
printf("Can not create sdl_createwindow : %s\n", SDL_GetError());
return 2;
}
SDL_CreateWindow函数参数
窗体名,
位置x,
位置y,
窗体宽度,
窗体高度,
旗标(最大化,最小化,全屏等)
关闭
SDL_Quit();
完整源码
#include <stdio.h>
#include "SDL.h"
#pragma comment(lib, "SDL2main.lib")
#pragma comment(lib, "SDL2.lib")
#define WIDTH 800
#define HEIGHT 600
int main()
{
if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
printf("Can not sdl_init_video, %s\n", SDL_GetError());
return 1;
}
// Create Window Entity
SDL_Window* win = SDL_CreateWindow("MyWindow", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
if (win == NULL)
{
printf("Can not create sdl_createwindow : %s\n", SDL_GetError());
return 2;
}
// Game Loop
while (1)
{
SDL_Event event;
if (SDL_PollEvent(&event)) {
}
}
return 0;
}