基于DevC++的SDL2图形程序设计(三) 一个游戏程序的类框架
编写了第一个图形程序后,咱们来讨论一下什么是动画和游戏。所谓动画简单理解就是连续的图形显示,如果每秒钟显示24幅图像,那么就可以达到影视作品的效果,如果每秒钟显示12幅图像就是动画了。所谓游戏简单理解就是加入了键盘或鼠标操作(又叫做交互操作)的动画,有可能当您在屏幕上单击鼠标左键时,动画中的人物(又叫做精灵)就朝着你鼠标左键单击的位置前进。由此发现一个根据命令移动的动画,至少需要交互操作和动作显示两个部分。
本课利用C++中的类给出一个游戏程序的框架,这样以后写动画或者游戏程序您只需修改里面的交互操作和动作就可以了。当然这个框架不是绝对不可修改的,只是建议大家这样使用。
一、编写程序
问题描述:在窗口中显示一幅图片。
具体操作:同前一个文档基本一致,不同的是程序内容。
编写程序如下
编译运行同前
1. 1. #include "SDL.h"
2. #include "SDL_image.h"
3. class Game{
4. private:
5. SDL_Window *w;
6. SDL_Renderer* r;
7. public:
8. Game();
9. ~Game();
10. void Init();//初始化
11. void EveProc(int&);//消息轮询
12. void Update(int);//事件操作
13. void OnDraw();//显示
14. };
15. Game::Game(){//构造函数初始化SDL,窗口,渲染器,字体,初始化变量
16. SDL_Init(SDL_INIT_EVERYTHING);
17. w= SDL_CreateWindow("first", 100, 100, 1280, 720,0);
18. r = SDL_CreateRenderer(w, -1, 0);
19. }
20. Game::~Game(){//析构函数释放资源
21. SDL_DestroyRenderer(r);
22. SDL_DestroyWindow(w);
23. SDL_Quit();
24. }
25. void Game::Init(){//初始化窗口界面
26. SDL_Surface *bg =IMG_Load("douluo1280_720.jpeg");//表面
27. SDL_Texture *bgt = SDL_CreateTextureFromSurface(r, bg);//纹理
28. SDL_RenderClear(r);
29. SDL_RenderCopy(r,bgt, 0, 0);
30. SDL_RenderPresent(r);
31. SDL_FreeSurface(bg);
32. SDL_DestroyTexture(bgt);
33. SDL_Delay(6000);
34. }
35. int main(int argc, char* argv[]){
36. Game game;//自动执行构造函数
37. game.Init();
38. return 0;//自动执行析构函数,返回0结束程序
39. }
二、程序中的类与类实现
本程序中给出一个Game类作为游戏程序的框架。
类图如下:
Game类共有2个数据成员和6个成员函数,其中重载的构造和析构函数。
1.构造函数与析构函数
构造函数与类同名,无返回值,在定义类对象时自动执行,可以用来启动SDL、初始化窗口和渲染器等操作。
析构函数无返回值,在程序结束(主函数结束)时自动执行,用于释放渲染器、窗口并退出SDL。
2.初始化函数Init()
该函数用于在启动程序后显示初始界面。包括定义表面载入背景图片、定义纹理,并调用渲染器操作显示窗口。在以后的程序设计中只需要修改图片名称即可。
3.游戏的核心操作——检测消息并产生动作
EveProc()用于检测用户的键盘或鼠标操作。
Update()和OnDraw()用于产生动作并显示。对于一个动画显示是分为后台操作函数和前台显示函数两部分的。我们学习的算法可以写在后台操作函数Update()中,然后再编写显示函数OnDraw()不断显示。
三者的调用关系如下:
while(EveProc()){
Update();
OnDraw();
}
即反复检测键盘鼠标操作,然后根据操作编写动作算法并显示(重新载入渲染器)。
由于我们还没有学习相关的操作,所有这三个函数只是预留接口。
三、主函数的实现
主函数主要用于生成一个类变量game,并调用game.Init()函数显示一个初始窗口。
自此程序框架基本完成,以后只需要修改游戏的核心操作,并在主函数中调用即可。