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

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

环境: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 ;
}

最新文章

  1. 如何下架app
  2. 配置项setOption -- title
  3. vi 使用入门
  4. 精品干货丨APP常用导航框架
  5. WPF学习之路(十二)控件(Items控件)
  6. linux运维常用命令及知识
  7. java中产生对象的两种方式
  8. Reason we use Camel
  9. ACM—最大连续子序列(HDOJ1003)
  10. C/C++ 内联函数
  11. js判断字符串中是否有数字和字母
  12. LeetCode 405. Convert a Number to Hexadecimal (把一个数转化为16进制)
  13. PHPmysqli的 其他函数 从数据库中读出数据并且打印出来
  14. docker同时删除多个容器
  15. sql 根据身份证号码计算年龄
  16. vue项目做seo优化(prerender-spa-plugin vue-meta-info)
  17. Python—反射
  18. Consul 常用指令
  19. Linux运维平台工具:pstree、ps、top、htop、free、vmstat、dstat、kill、killall
  20. GreaseMonkey开发(一):第一个自定义插件Hello GreaseMonkey!

热门文章

  1. 识别SQL Server 性能杀手
  2. PostgreSQL SystemTap on Linux
  3. pycharm整体缩进的快捷键
  4. Linux服务器同步网络时间
  5. Intent传递简单对象与集合
  6. BUPT复试专题—最长连续等差子数列(2014软院)
  7. Unity3d插件]EasyTouch简单使用方法
  8. Autolayout和VFL
  9. Hibernate 配置C3P0 连接池
  10. Tomcat 80端口 配置及域名访问步骤