当前位置 博文首页 > 劙玟蜮的博客:用SDL2写推箱子

    劙玟蜮的博客:用SDL2写推箱子

    作者:[db:作者] 时间:2021-09-19 22:43

    详细过程看这里(要下载图片)知乎劙玟蜮

    代码为本人所写,版权所有!严禁转载!!只供学习!!!

    运行结果:
    在这里插入图片描述

    
    /*
       <- 作者:劙玟蜮
       <- 开发时间 : 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  ||
    
    下一篇:没有了