SDL Game Development-第1章

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9139
QQ
跳转到指定楼层
楼主
发表于 2017-12-19 09:13:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
【简介】学习在Code::Blocks 13.12中,使用SDL2.0库的方法。基于g++的C++11选项
原书下载地址:http://it-ebooks.info/book/2960/
SDL2.0官方地址:http://www.libsdl.org/

第一章:程序的基本架构
main.cpp的内容
  1. #include "Game.h"

  2. Game* g_game = 0;   //全局实例

  3. //这里演示了基本框架结构
  4. int main(int argc, char* argv[])
  5. {
  6.     g_game = new Game();    //Game类对象实例
  7.     g_game->init("Charpter 1", 100, 100, 640, 480, 0);  //初始化
  8.         //标题:Charpter 1,
  9.         //x,y位置:100, 100
  10.         //窗口宽高:640, 480
  11.         //窗口标志:0
  12.         //标志建议使用:SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_OPENGL

  13.     while(g_game->running())    //开始主循环
  14.     {
  15.         g_game->handleEvents(); //处理输入
  16.         g_game->update();   //计算时间和碰撞
  17.         g_game->render();   //渲染到屏幕
  18.     }
  19.     g_game->clean();    //清理资源,退出

  20.     return 0;
  21. }
复制代码
Game.h的内容
  1. #ifndef __Game__
  2. #define __Game__
  3. #include <SDL.h>

  4. class Game
  5. {
  6. public:
  7.     Game();
  8.     ~Game();
  9.     bool init(const char* title, int xpos, int ypos, int width, int height, int flags);  //初始化
  10.     void render();
  11.     void update();
  12.     void handleEvents();
  13.     void clean();
  14.     bool running() { return m_bRunning; }   //返回运行状态
  15. private:
  16.     SDL_Window* m_pWindow;  //窗口资源指针
  17.     SDL_Renderer* m_pRenderer;  //渲染器资源指针
  18.     bool m_bRunning;

  19. };

  20. #endif // __Game__
复制代码
Game.cpp的内容
  1. #include <iostream>
  2. //注:对于在VS 2012 EXPRESS的IDE中使用std::cout,
  3. //需要包含Windows.h,
  4. //然后调用AllocConsole(); 和freopen("CON", "w", stdout);
  5. //将上述内容添加到main.cpp中
  6. #include "Game.h"
  7. Game::Game()
  8. {

  9. }
  10. Game::~Game()
  11. {

  12. }
  13. bool Game::init(const char* title, int xpos, int ypos, int width, int height, int flags)
  14. {
  15.     if(SDL_Init(SDL_INIT_EVERYTHING) == 0)  //SDL_Init成功。参数也可写为SDL_INIT_VIDEO | SDL_INIT_TIMER
  16.     {
  17.         std::cout << "SDL init success\n";
  18.         //调用SDL的创建窗口函数,返回窗口资源指针
  19.         m_pWindow = SDL_CreateWindow(title, xpos, ypos, width, height, flags);
  20.         if(m_pWindow !=0)   //窗口创建成功
  21.         {
  22.             std::cout << "window creation success\n";
  23.             //创建渲染器资源
  24.             m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
  25.             if(m_pRenderer != 0)    //渲染器创建成功
  26.             {
  27.                 std::cout << "renderer creation success\n";
  28.                 //设置当前渲染色,rgba,红绿蓝透明四通道
  29.                 SDL_SetRenderDrawColor(m_pRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
  30.             }else {
  31.                 std::cout << "renderer init fail\n";
  32.                 return false;   //渲染器失败
  33.             }
  34.         }else {
  35.             std::cout << "window init fail\n";
  36.             return false; //窗口创建失败
  37.         }
  38.     }else{
  39.         std::cout << "SDL init fail\n";
  40.         return false; //SDL库初始失败
  41.     }

  42.     std::cout << "init success\n";
  43.     m_bRunning = true;  //所有初始都成功,可以开始主循环了
  44.     return true;
  45. }

  46. void Game::render()
  47. {
  48.     SDL_RenderClear(m_pRenderer);   //清屏
  49.     //绘制对象
  50.     SDL_RenderPresent(m_pRenderer); //双缓冲翻转,新内容显示到屏幕上
  51. }

  52. void Game::update()
  53. {

  54. }

  55. void Game::handleEvents()
  56. {
  57.     SDL_Event event;    //这个变量放这里合适否?每次循环都会生成这个局部变量
  58.     if(SDL_PollEvent(&event))
  59.     {
  60.         switch(event.type)
  61.         {
  62.         case SDL_QUIT:
  63.             m_bRunning = false; //结束循环
  64.             break;

  65.         default:
  66.             break;
  67.         }
  68.     }   //事件处理在第4章详细介绍
  69. }

  70. void Game::clean()
  71. {
  72.     std::cout << "cleaning game\n";
  73.     SDL_DestroyWindow(m_pWindow);   //销毁资源,可以加上判断
  74.     //if(m_pWindow) { SDL_DestroyWindow(m_pWindow); }
  75.     SDL_DestroyRenderer(m_pRenderer);
  76.     SDL_Quit();
  77. }
复制代码

运行结果:


最后:关于全屏
//修改Game.h中的init()函数原型
  1. bool init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen);
复制代码
//修改Game.cpp中的init()函数实现
  1. bool Game::init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen)

  2. {

  3. flags = 0;

  4. if(fullscreen)

  5.     flags = SDL_WINDOW_FULLSCREEN;

  6. //上述代码放在SDL_CreateWindow()之前

  7. ...
复制代码
//main.cpp中的调用代码,改为
  1. if(g_game->init("Chapter 1", 100, 100, 640, 480, true));

  2. //true传入,指示全屏创建窗口
复制代码

分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表