运行结果:
/*
<- 作者:劙玟蜮
<- 开发时间 : 2020 7 17
<- 推箱子游戏制作
<- 2020 7 18 完成
<- 2020 7 20 更新
*/
// SDL2图形库头文件
#include <SDL2/SDL.h>
// PNG图片加载头需要文件
#include <SDL2/SDL_image.h>
using namespace std;
/** <- 声明二维数组, 用于保存移动后的地图数据
<- 1:墙 2:箱子 3:目的地 6:人
*/
int Map[9][9] = {
{1, 1, 1, 1, 1, 0, 0, 0, 0},
{1, 0, 0, 0, 1, 0, 0, 0, 0},
{1, 0, 2, 0, 1, 0, 1, 1, 1},
{1, 0, 0, 0, 1, 0, 1, 3, 1},
{1, 1, 1, 0, 1, 1, 1, 0, 1},
{0, 1, 1, 0, 0, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 1, 0, 0, 1},
{0, 1, 0, 0, 6, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 0, 0, 0},};
int main ( int argc, char* argv[] )
{
// 声明变量, 后面确定位置用
int i, j, x, y;
// 创建窗口名为 'hello' 大小800 * 600
SDL_Window* Window = SDL_CreateWindow( "hello", SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED, 450, 400, SDL_WINDOW_SHOWN );
SDL_Renderer* render = SDL_CreateRenderer( Window, -1, SDL_RENDERER_ACCELERATED );
/* 声明 SDL_Surface 型变量 */
// 1: 加载 "地图" 图片
SDL_Surface* MapSurface = IMG_Load("Map.png");
// 2: 加载 "人" 图片
SDL_Surface* HumanSurface = IMG_Load("Human.png");
// 3: 加载 "箱子" 图片
SDL_Surface* ChestSurface = IMG_Load("Chest.png");
// 4: 加载 "目的地" 图片
SDL_Surface* WhitherSurface = IMG_Load("Whither.png");
// 5: 加载 "胜利" 图片
SDL_Surface* HumanWonSurface = IMG_Load("HumanWon.png");
SDL_Texture* MapTexture = SDL_CreateTextureFromSurface(render, MapSurface);
SDL_Texture* HumanTexture = SDL_CreateTextureFromSurface(render, HumanSurface);
SDL_Texture* ChestTexture = SDL_CreateTextureFromSurface(render, ChestSurface);
SDL_Texture* WhitherTexture = SDL_CreateTextureFromSurface(render, WhitherSurface);
SDL_Texture* HumanWonTexture = SDL_CreateTextureFromSurface(render, HumanWonSurface);
/************************************************************/
// 初始化 "人" 的位置 和 图片大小
SDL_Rect HumanRect;
HumanRect.x = 200;
HumanRect.y = 350;
HumanRect.w = HumanSurface -> w;
HumanRect.h = HumanSurface -> h;
/***********************************************************/
// 初始化 "箱子" 的位置 和 图片大小
SDL_Rect ChestRect;
ChestRect.x = 100;
ChestRect.y = 100;
ChestRect.w = ChestSurface -> w;
ChestRect.h = ChestSurface -> h;
/***********************************************************/
// 、初始化 " 目的地" 的位置 和 图片大小
SDL_Rect WhitherRect;
WhitherRect.x = 350;
WhitherRect.y = 150;
WhitherRect.w = WhitherSurface -> w;
WhitherRect.h = WhitherSurface -> h;
/***********************************************************/
// 初始化 "胜利" 的位置 和 图片大小
SDL_Rect HumanWonRect;
HumanWonRect.x = 100;
HumanWonRect.y = 100;
HumanWonRect.w = HumanWonSurface -> w;
HumanWonRect.h = HumanWonSurface -> h;
/***********************************************************/
// 事件驱动
SDL_Event AllEvent;
bool quit = true;
while ( quit ){
while ( SDL_PollEvent( &AllEvent ) ){
switch ( AllEvent.type )
{
// 用于判断用户是否点击关闭窗口
case SDL_QUIT: quit = false; break;
// 键盘事件
case SDL_KEYDOWN:
for(i = 0; i < 9; i++)
for(j = 0; j < 9; j++)
if (Map[i][j] == 6 || Map[i][j] == 9)
{
x = i;
y = j;
}
switch (AllEvent.key.keysym.sym)
{
case SDLK_UP:
if (Map[x - 1][y] == 0 || Map[x - 1][y] == 3)
{
Map[x - 1][y] += 6;
Map[x][y] -= 6;
HumanRect.y -= 50;
}
else if (Map[x - 1][y] == 2 || Map[x - 1][y] == 5)
{
if (Map[x - 2][y] == 0 || Map[x - 2][y] == 3)
{
Map[x - 2][y] += 2;
ChestRect.y -= 50;
if (Map[x - 1][y] == 2) Map[x - 1][y] += 4;
else if (Map[x + 1][y] == 5) Map[x + 1][y]++;
HumanRect.y -= 50;
if (Map[x][y] == 9 || Map[x][y] == 6)
Map[x][y] -= 6;
}
}
else;
break;
case SDLK_DOWN:
if (Map[x + 1][y] == 0 ||