基于 SDL2 的事件驱动编程

其实没必要说得太复杂...就是读取用户输入啦。

沿用上一篇的代码,加入事件轮询。

环境:SDL2 + VC++2015

下面的代码将打开background.png和event.png,将background平铺背景,将event作为前景呈现。

  1 #include <stdexcept>
  2 #include <string>
  3 #include <iostream>
  4 #include "SDL.h"
  5 #include "SDL_image.h"
  6
  7 //屏幕宽度
  8 const int SCREEN_WIDTH = 1600;
  9 const int SCREEN_HEIGHT = 900;
 10
 11 //全局窗口和渲染器
 12 SDL_Window *window = nullptr;
 13 SDL_Renderer *renderer = nullptr;
 14
 15 //加载图片
 16 SDL_Texture* LoadImage(std::string file)
 17 {
 18     SDL_Texture* tex = nullptr;
 19     tex = IMG_LoadTexture(renderer, file.c_str());
 20     if (tex == nullptr)
 21         throw std::runtime_error("Failed to load image: " + file + IMG_GetError());
 22     return tex;
 23 }
 24
 25 //将表面应用到渲染器
 26 void ApplySurface(int x, int y, SDL_Texture *tex, SDL_Renderer *rend)
 27 {
 28     SDL_Rect pos;
 29     pos.x = x;
 30     pos.y = y;
 31     SDL_QueryTexture(tex, NULL, NULL, &pos.w, &pos.h);
 32     SDL_RenderCopy(rend, tex, NULL, &pos);
 33 }
 34
 35 int main(int argc, char** argv)
 36 {
 37     //初始化SDL
 38     if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
 39     {
 40         std::cout << SDL_GetError() << std::endl;
 41         return 1;
 42     }
 43
 44     //创建窗口
 45     window = SDL_CreateWindow("Lesson 4 - Event Driven Programming",
 46         SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
 47         SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
 48     if (window == nullptr)
 49     {
 50         std::cout << SDL_GetError() << std::endl;
 51         return 2;
 52     }
 53
 54     //创建渲染器
 55     renderer = SDL_CreateRenderer(window, -1,
 56         SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
 57     if (renderer == nullptr)
 58     {
 59         std::cout << SDL_GetError() << std::endl;
 60         return 3;
 61     }
 62
 63     //创建背景和前景纹理
 64     SDL_Texture *background = nullptr, *image = nullptr;
 65     try {
 66         background = LoadImage("background.png");
 67         image = LoadImage("event.png");
 68     }
 69     catch (const std::runtime_error &e) {
 70         std::cout << e.what() << std::endl;
 71         return 4;
 72     }
 73
 74     bool quit = false;
 75     SDL_Event e;
 76     //主循环(CPU高占用)
 77     while (!quit)
 78     {
 79         //轮询事件栈e
 80         while (SDL_PollEvent(&e))
 81         {
 82             //用户关闭窗口
 83             if (e.type == SDL_QUIT) quit = true;
 84
 85             //用户按下键盘
 86             if (e.type == SDL_KEYDOWN) quit = true;
 87
 88             //用户点击鼠标
 89             if (e.type == SDL_MOUSEBUTTONDOWN) quit = true;
 90
 91             //清空渲染器
 92             SDL_RenderClear(renderer);
 93
 94             //在渲染器内平铺背景
 95             int bW, bH;
 96             SDL_QueryTexture(background, NULL, NULL, &bW, &bH);
 97             for (int y = 0; y <= SCREEN_HEIGHT; y += bH)
 98                 for (int x = 0; x <= SCREEN_WIDTH; x += bW)
 99                     ApplySurface(x, y, background, renderer);
100
101
102             //在渲染器中央放置前景
103             int iW, iH;
104             SDL_QueryTexture(image, NULL, NULL, &iW, &iH);
105             int x = SCREEN_WIDTH / 2 - iW / 2;
106             int y = SCREEN_HEIGHT / 2 - iH / 2;
107             ApplySurface(x, y, image, renderer);
108
109             //呈现渲染器
110             SDL_RenderPresent(renderer);
111         }
112     }
113
114     //释放资源
115     SDL_DestroyTexture(background);
116     SDL_DestroyTexture(image);
117     SDL_DestroyRenderer(renderer);
118     SDL_DestroyWindow(window);
119
120     SDL_Quit();
121
122     return 0;
123 }
时间: 2024-10-18 19:36:21

基于 SDL2 的事件驱动编程的相关文章

Android事件驱动编程-基于EventBus(一)

Android事件驱动编程-基于EventBus(一) --欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢-- 原文链接:https://medium.com/google-developer-experts/event-driven-programming-for-android-part-i-f5ea4a3c4eab 本文Gitbooks链接:http://asce1885.gitbooks.io/android-rd-

Android事件驱动编程-基于EventBus(二)

Android事件驱动编程(二) --欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢-- 原文链接:https://medium.com/google-developer-experts/event-driven-programming-for-android-part-ii-b1e05698e440 本文Gitbooks链接:http://asce1885.gitbooks.io/android-rd-senior-adv

dojo事件驱动编程之事件绑定

什么是事件驱动? 事件驱动编程是以事件为第一驱动的编程模型,模块被动等待通知(notification),行为取决于外来的突发事件,是事件驱动的,符合事件驱动式编程(Event-Driven Programming,简称EDP)的模式. 何谓事件?通俗地说,它是已经发生的某种令人关注的事情.在软件中,它一般表现为一个程序的某些信息状态上的变化.基于事件驱动的系统一般提供两类的内建事件(built-in event):一类是底层事件(low-level event)或称原生事件(native ev

12.队列的应用-事件驱动编程

1.事件驱动编程 前面我们提到队列在操作系统中用的非常多,其中一大应用就是基于事件驱动的消息队列机制,熟悉Windows SDK程序设计的对于Windows的消息产生.分发.处理应该不会陌生. 事件驱动编程简而言之就是应用程序维护一个或多个事件队列,完全以事件队列为主线来设计和编写整个程序.如Windows就是以消息队列为中心来对每个消息进行处理从而实现事件驱动编程(如鼠标.键盘等事件的处理). 2.离散事件模拟 现在为了演示事件驱动编程,我可能并没有能力去构建一个windows消息系统,这里以

理解Node.js事件驱动编程

Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现). 但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优势? Node.Js是基于javascript语言,建构在google V8 engine以及Linux上的一个非阻塞事件驱动IO框架.nodejs是单进程单线程,但是基于V8的强大驱动力,以及事件驱动模型,nodejs的 性能非常高,而且想达到多核或者多进程也不是很难(现在已经有大量的第三方mo

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introduction/ netty是基于NIO实现的异步事件驱动的网络编程框架,学完NIO以后,应该看看netty的实现,netty框架涉及的内容特别多,这里只介绍netty的基本使用和实现原理,更多扩展的内容将在以后推出. 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎

事件驱动编程

看完公司的基于Netty的游戏框架,框架中用到了多态,函数式编程和事件驱动编程,第一次看到事件驱动的时候,就想到跟观察者模式很像. 事件驱动初上手感觉还很好用,在我自己写的项目里,要写很多爬虫,比如下面爬虫的例子,我只是想关心拼接URL地址,和关心不同的网站怎么解析DOM元素,写一个回调就好 多态,函数式编程和事件驱动编程,这三个还是然让我学到很多,可以用一个框架的基础,比如在Netty中,继承SimpleChannelInboundHandler<TextWebSocketFrame>,实现

Linux的I/O模式、事件驱动编程模型

大纲: (1)基础概念回顾 (2)Linux的I/O模式 (3)事件驱动编程模型 (4)select/poll/epoll的区别和Python示例 网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,总听别人装13不如自己下来钻研一下.不过,搞清楚这些概念之前,还得先回顾一些基础的概念. 1.基础知识回顾 注意:咱们下面说的都是Linux环境下,跟Windows不一样哈~~~ 1.1 用户空间和内核空间 现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内

图形用户界面编程——事件驱动编程

根据事件发生而执行代码的编程方式,称为事件驱动编程 事件源——>监听——>处理事件(处理函数) ps:实现按键全选和反选 运行结果图