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

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

环境:SDL2 + VC++2015

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

 #include <stdexcept>
#include <string>
#include <iostream>
#include "SDL.h"
#include "SDL_image.h" //屏幕宽度
const int SCREEN_WIDTH = ;
const int SCREEN_HEIGHT = ; //全局窗口和渲染器
SDL_Window *window = nullptr;
SDL_Renderer *renderer = nullptr; //加载图片
SDL_Texture* LoadImage(std::string file)
{
SDL_Texture* tex = nullptr;
tex = IMG_LoadTexture(renderer, file.c_str());
if (tex == nullptr)
throw std::runtime_error("Failed to load image: " + file + IMG_GetError());
return tex;
} //将表面应用到渲染器
void ApplySurface(int x, int y, SDL_Texture *tex, SDL_Renderer *rend)
{
SDL_Rect pos;
pos.x = x;
pos.y = y;
SDL_QueryTexture(tex, NULL, NULL, &pos.w, &pos.h);
SDL_RenderCopy(rend, tex, NULL, &pos);
} int main(int argc, char** argv)
{
//初始化SDL
if (SDL_Init(SDL_INIT_EVERYTHING) == -)
{
std::cout << SDL_GetError() << std::endl;
return ;
} //创建窗口
window = SDL_CreateWindow("Lesson 4 - Event Driven Programming",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (window == nullptr)
{
std::cout << SDL_GetError() << std::endl;
return ;
} //创建渲染器
renderer = SDL_CreateRenderer(window, -,
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == nullptr)
{
std::cout << SDL_GetError() << std::endl;
return ;
} //创建背景和前景纹理
SDL_Texture *background = nullptr, *image = nullptr;
try {
background = LoadImage("background.png");
image = LoadImage("event.png");
}
catch (const std::runtime_error &e) {
std::cout << e.what() << std::endl;
return ;
} bool quit = false;
SDL_Event e;
//主循环(CPU高占用)
while (!quit)
{
//轮询事件栈e
while (SDL_PollEvent(&e))
{
//用户关闭窗口
if (e.type == SDL_QUIT) quit = true; //用户按下键盘
if (e.type == SDL_KEYDOWN) quit = true; //用户点击鼠标
if (e.type == SDL_MOUSEBUTTONDOWN) quit = true; //清空渲染器
SDL_RenderClear(renderer); //在渲染器内平铺背景
int bW, bH;
SDL_QueryTexture(background, NULL, NULL, &bW, &bH);
for (int y = ; y <= SCREEN_HEIGHT; y += bH)
for (int x = ; x <= SCREEN_WIDTH; x += bW)
ApplySurface(x, y, background, renderer); //在渲染器中央放置前景
int iW, iH;
SDL_QueryTexture(image, NULL, NULL, &iW, &iH);
int x = SCREEN_WIDTH / - iW / ;
int y = SCREEN_HEIGHT / - iH / ;
ApplySurface(x, y, image, renderer); //呈现渲染器
SDL_RenderPresent(renderer);
}
} //释放资源
SDL_DestroyTexture(background);
SDL_DestroyTexture(image);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window); SDL_Quit(); return ;
}

用 SDL2 进行事件驱动编程的更多相关文章

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

    什么是事件驱动? 事件驱动编程是以事件为第一驱动的编程模型,模块被动等待通知(notification),行为取决于外来的突发事件,是事件驱动的,符合事件驱动式编程(Event-Driven Prog ...

  2. 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术

    一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有 ...

  3. 理解Node.js事件驱动编程

    Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现). 但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点 ...

  4. python2.0_s12_day9_事件驱动编程&异步IO

    论事件驱动与异步IO 事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定.它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理.另外两种常见的编程范式是(单线程)同步以及 ...

  5. 什么是node.js的事件驱动编程

    Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现).但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优 ...

  6. Python交互式编程导论----事件驱动编程

    传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结束 每一个代码块里是完成各种各样事情 ...

  7. C语言+SDL2 图形化编程

    程设大作业小火车第一版本是命令行界面,第二版本是图形化界面,由于egg库对以后工程开发没有用,我不想用egg库,花了很长时间浏览了一下OpenGL的中文教程,觉得好复杂,需要看很多很多才能写出个简单的 ...

  8. Java题库——Chapter15 事件驱动编程和动画

    Chapter 15 Event-Driven Programming and Animations Section 15.2 Events and Event Sources1.    A Java ...

  9. Python并发编程-事件驱动模型

     一.事件驱动模型介绍                                                                                         ...

随机推荐

  1. Linux使用screen实现关闭ssh连接的情况下,让程序继续在后台运行

    Ubuntu默认没有安装screen,需要手动安装. 安装命令: sudo apt-get install screen 简单的操作方法: 直接输入命令 screen 进入screen子界面,此时pu ...

  2. Fragment 生命周期怎么来的?

    前言 Fragment对于 Android 开发人员来说一点都不陌生,由于差点儿不论什么一款 app 都大量使用 Fragment,所以 Fragment 的生命周期相信对于大家来说应该都非常清晰.但 ...

  3. MySQL的字符编码体系(一)——数据存储编码

    安装MySQL好多次了,每次都会纠结于数据库的字符编码配置,所以我决定这一次彻底把它理清. MySQL的字符编码结构比較细,它慷慨向分为两个部分:数据存储编码和传输数据编码.本篇讨论数据存储编码部分, ...

  4. docker save docker load

    docker save && docker load docker save 镜像1 镜像2 | gzip > images.tar.gz 打包镜像为压缩文件 docker sa ...

  5. stl_内存基本处理工具

    内存基本处理工具 STL定义5个全局函数.作用于初始化空间上.各自是:用于构造的construct(),用于析构的destroy(),uninitialized_copy(),uninitialize ...

  6. 实现多线程的方式Runnable

    package com.thread.runnable; /** * 实现多线程的方式有继承Thread类和实现Runnable接口两种方式 * 哪种方式更好呢?实现的方式由于继承的方式. * 原因: ...

  7. HDU 1022 Train Problem I (数据结构 —— 栈)

    Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot o ...

  8. C++类使用static小例子(新手学习C++)

    //为什么类的成员中不能包括动态分配的数据,若包含静态数据怎么使用?#include <iostream>using namespace std;class point{    priva ...

  9. C# does not contain a constructor that takes no parameter

    C# 中子类要重用父类的构造函数时, 一般会在子类构造函数后面调用 : base(paratype, para). 如果父类有一个參数个数为1的构造函数, 没有 0 參构造函数. 子类想要重用这个构造 ...

  10. 在vs2005中添加lib库的方法

    方法一:在用到lib的地方加上  //强烈推荐这种方法.#pragma    comment(lib,"libname.lib") 方法二:     点击菜单命令 “项目/属性”, ...