我认为使用SDL的优势在于:
- 鼻祖级的跨平台开源框架
- 始终如一的代码,API几乎很少变动
- sf/Git-hub数以万计的开源project,其中不乏商业案例可以借签学习
- SDL 2.x版本加入了对Android的支持,使用NDK即可编译
- 同样有其他语言的binding,如Pascal, Objective-C, Python, Ruby,and Java ...
- Game,模拟器,播放器,图形库等领域都能看到它的身影
**废话不说了,let's go ** 示例代码创建一个最基本的SDL窗体。
#include <SDL.h>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
SDL_Window* pWindow = 0;
SDL_Renderer *pRenderer = 0;
bool bRunning = true;
if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
cerr << "SDL_Init fail" << endl;
return EXIT_FAILURE;
}
pWindow = SDL_CreateWindow("Hello,SDL",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640, 480, SDL_WINDOW_SHOWN);
if (pWindow != nullptr)
{
pRenderer = SDL_CreateRenderer(pWindow,
-1, 0);
}
else
return EXIT_FAILURE;
SDL_SetRenderDrawColor(pRenderer, 0, 0, 0, 255);
SDL_Event event;
while (bRunning)
{
if (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
bRunning = false;
break;
default:
break;
}
}
SDL_RenderClear(pRenderer);
SDL_RenderPresent(pRenderer);
}
SDL_DestroyWindow(pWindow);
SDL_DestroyRenderer(pRenderer);
SDL_Quit();
return 0;
}
SDL_Init
int SDL_Init(Uint32 flags)
- SDL_Init 其实是调用SDL_InitSubSystem() 初始化子系统,包含以下flags,
- SDL_INIT_TIMER
- SDL_INIT_AUDIO
- SDL_INIT_VIDEO
- SDL_INIT_JOYSTICK
- SDL_INIT_HAPTIC
- SDL_INIT_GAMECONTROLLER
- SDL_INIT_EVENTS
- SDL_INIT_EVERYTHING
- SDL_INIT_NOPARACHUTE 可以使用或运算符| 同时初始化若干子系统,如
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
另外也可以使用SDL_WasInit 来检查子系统是否初始化成功。
SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,
int index,
Uint32 flags)
index 可以理解为当前的支援渲染的显卡索引, 赋值为-1 使用第一个显卡
flags 有以下3个可供选择
-
SDL_RENDERER_SOFTWARE
-
SDL_RENDERER_ACCELERATED
-
SDL_RENDERER_PRESENTVSYNC
-
SDL_RENDERER_TARGETTEXTURE
-
SDL_Window ,SDL_Renderer 可以使用SDL_DestroyWindow(),SDL_DestroyRenderer()销毁
-
SDL_Event 循环
-
渲染和绘制操作通常独立到单独的函数中,如
void draw (SDL_Renderder*)
{
//draw something...
}
void render( )
{
SDL_RenderClear(pRenderer);
draw(pRenderer);
SDL_RenderPresent(pRenderer);
}
本文参考Shaun Mitchell 《SDL Game Development》