需要安装SDL2的image扩展库
sudo apt install libsdl2-image-dev
Linux下编译方式:
gcc 源文件 -lSDL2 -lSDL2_image
图片切换代码:
#include <stdio.h>
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <stdbool.h>
#define WIDTH 182//根据自己的图片 非必要
#define HEIGHT 179
#define SCREENWIDTH 800
#define SCREENHEIGHT 600
int main(int argc, char *argv[])
{
SDL_Init(SDL_INIT_VIDEO);//SDL初始化程序,动画
SDL_Window* window = SDL_CreateWindow("SDL_try2",
100,
100,
SCREENWIDTH,SCREENHEIGHT,
SDL_WINDOW_SHOWN);//创建窗口
SDL_Surface* surface = SDL_GetWindowSurface(window);//得到窗口所在表面
SDL_Surface* smile =IMG_Load("smile.png");//得到笑脸图片
SDL_Surface* cry = IMG_Load("cry.png");//得到哭脸图片
SDL_Surface* currentface;
SDL_Event event;
SDL_Rect rect;
rect.x=0;
rect.y=0;
int speed=10;//给一个速度变量,后面可以改变速度
SDL_BlitSurface(smile,NULL,surface,&rect);
bool quit = false;
while(quit == false){
while(SDL_PollEvent(&event)){
if(event.type == SDL_QUIT){
quit = true;
}
else if(event.type == SDL_MOUSEBUTTONDOWN){//事件类型为鼠标事件
if(event.button.button==SDL_BUTTON_LEFT){
currentface = smile;//点击鼠标左键变为笑脸,event.button是个结构体,里面还包含其他信息(不常用)。
SDL_BlitSurface(currentface,NULL,surface,&rect);
}
else if(event.button.button == SDL_BUTTON_RIGHT){
currentface = cry;//点击鼠标右键
SDL_BlitSurface(currentface,NULL,surface,&rect);
}
}
else if(event.type == SDL_KEYDOWN){//键盘事件
if(event.key.keysym.sym == SDLK_UP){
rect.y-=speed; //event.key.keysym.sym表示按键的虚拟码, 此时表示 上
}
if(event.key.keysym.sym == SDLK_DOWN){
rect.y+=speed;
}
if(event.key.keysym.sym == SDLK_LEFT){
rect.x-=speed;
}
if(event.key.keysym.sym == SDLK_RIGHT){
rect.x+=speed;
}
if(event.key.keysym.sym == SDLK_MINUS){
speed--;
}
if(event.key.keysym.sym == SDLK_EQUALS){
speed++;
}
if(rect.x<0)rect.x=0;//避免图形越过屏幕,设置边界
if((rect.x+WIDTH)>SCREENWIDTH)rect.x = SCREENWIDTH-WIDTH;
if(rect.y<0)rect.y=0;
if((rect.y+HEIGHT)>SCREENHEIGHT)rect.y = SCREENHEIGHT-HEIGHT;
SDL_FillRect(surface,NULL,0);//填充背景色,0表示黑色
SDL_BlitSurface(currentface,NULL,surface,&rect);
}
SDL_UpdateWindowSurface(window);
}
}
SDL_FreeSurface(surface);//释放内存,安全退出
SDL_FreeSurface(smile);
SDL_FreeSurface(cry);
SDL_FreeSurface(currentface);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}