SDL事件实现背景平铺、前景图移动
#include <iostream>
#include <string>
extern "C"
{
#include <SDL.h>
#include <SDL_image.h>
}
#pragma comment(lib, "SDL2.lib")
#define SCREEN_WIDTH 1600
#define SCREEN_HEIGHT 900
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("Load image failed" + file + IMG_GetError());
return tex;
}
void copyTextureToRender(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);
}
#undef main
int main(int argc, char** argv)
{
if (::SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
std::cout << SDL_GetError() << std::endl;
return 1;
}
window = ::SDL_CreateWindow("Event Demo",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN);
if (window == nullptr)
{
std::cout << SDL_GetError() << std::endl;
return 2;
}
renderer = ::SDL_CreateRenderer(window, -1,
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == nullptr)
{
std::cout << SDL_GetError() << std::endl;
return 3;
}
SDL_Texture *background = nullptr, *image = nullptr;
try {
background = LoadImage("./bk.jpg");
image = LoadImage("./longong.jpg");
}
catch (const std::runtime_error &e) {
std::cout << e.what() << std::endl;
return 4;
}
bool quit = false;
SDL_Event e;
int iW, iH, x, y;
int dx = 0, dy = 0;
while (!quit)
{
while (SDL_PollEvent(&e))
{
if (e.type == SDL_QUIT)
quit = true;
if (e.type == SDL_KEYDOWN)
{
if (e.key.keysym.sym == SDLK_LEFT)
{
dx -= 10;
printf("SDLK_LEFT...");
}
else if (e.key.keysym.sym == SDLK_RIGHT)
{
printf("SDLK_RIGHT...");
dx += 10;
}
else if (e.key.keysym.sym == SDLK_UP)
{
printf("SDLK_UP...");
dy -= 10;
}
else if (e.key.keysym.sym == SDLK_DOWN)
{
printf("SDLK_DOWN...");
dy += 10;
}
}
if (e.type == SDL_MOUSEBUTTONDOWN)
quit = true;
SDL_RenderClear(renderer);
int bW, bH;
SDL_QueryTexture(background, NULL, NULL, &bW, &bH);
for (int y = 0; y <= SCREEN_HEIGHT; y += bH)
for (int x = 0; x <= SCREEN_WIDTH; x += bW)
copyTextureToRender(x, y, background, renderer);
SDL_QueryTexture(image, NULL, NULL, &iW, &iH);
x = SCREEN_WIDTH / 2 - iW / 2 + dx;
y = SCREEN_HEIGHT / 2 - iH / 2 + dy;
copyTextureToRender(x, y, image, renderer);
SDL_RenderPresent(renderer);
}
}
if (background)
{
SDL_DestroyTexture(background);
}
if (image)
{
SDL_DestroyTexture(image);
}
if (renderer)
{
SDL_DestroyRenderer(renderer);
}
if (window)
{
SDL_DestroyWindow(window);
}
SDL_Quit();
return 0;
}
使用SDL事件实现图片的移动、缩放
#include <iostream>
extern "C"
{
#include <SDL.h>
}
#undef main
int main()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window* win = SDL_CreateWindow("yx3sxmeng",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
800, 600,
SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
SDL_Surface* surface = SDL_LoadBMP("./Panda.bmp");
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
bool quit = false;
SDL_Event ev;
SDL_Rect rect = { 0, 0, 800, 600 };
int sx = 0, sy = 0;
while (!quit)
{
while (SDL_PollEvent(&ev))
{
switch (ev.type)
{
case SDL_QUIT:
quit = true;
break;
case SDL_MOUSEBUTTONDOWN:
sx = ev.button.x + rect.x;
sy = ev.button.y + rect.y;
break;
case SDL_MOUSEMOTION:
if (ev.motion.state & SDL_BUTTON_LMASK)
{
rect.x = ev.motion.x - sx;
rect.y = ev.motion.y - sy;
}
break;
case SDL_KEYDOWN:
if (ev.key.keysym.sym == SDLK_LEFT)
{
rect.x -= 10;
printf("SDLK_LEFT...");
}
else if (ev.key.keysym.sym == SDLK_RIGHT)
{
rect.x += 10;
printf("SDLK_RIGHT...");
}
else if (ev.key.keysym.sym == SDLK_UP)
{
rect.w += 10;
rect.h += 10;
printf("SDLK_UP...");
}
else if (ev.key.keysym.sym == SDLK_DOWN)
{
rect.w -= 10;
rect.h -= 10;
printf("SDLK_DOWN...");
}
printf("scancode=%d\n", ev.key.keysym.scancode);
break;
case SDL_MOUSEWHEEL:
if (ev.wheel.y > 0)
{
rect.h *= 1.1;
rect.w *= 1.1;
}
if (ev.wheel.y < 0)
{
rect.w /= 1.1;
rect.h /= 1.1;
}
break;
}
}
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, &rect);
SDL_RenderPresent(renderer);
SDL_Delay(16);
}
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}