SDL - Game Framework - Tutorial Basics

大部分游戏由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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值