C++与SDL实现奔跑吧叽咔

CPP+SDL引擎实现

奔跑吧叽卡(No jumping)是游戏工作室Ticktock正式发布的第四款游戏
叽卡是一只不会飞也不会跳的小鸟,只会用柔软的肚皮向前走
环游世界是它最大的梦想,冰雪王国,月光之城,魔法森林……
现在我用C++与SDL渲染移植了这个游戏
项目地址:https://github.com/PIKACHUIM/PIKA-CPP-NoJumping

源代码文件

二进制文件

游戏图片

游戏截图

菜单界面:
game1.jpg
游戏界面:
game2.jpg
过关界面:
game3.jpg

工程架构

pros.jpg

入口main.cpp:

#undef main
#include "./EXTL/WIND.CPP"
#include "./LIBS/REND.CPP"
#include "MENU.CPP"
int main(int argc,char *argv[])
{

    WIND_INIT(argc,argv);
    REND_INIT();
    MENU_INIT();
    MENU_SHOW();
    WIND_EXIT();
    return 0;
}

主菜单menu.cpp

#pragma once
#ifndef MENU_CPP
#define MENU_CPP
#include"LIBS/IMGS.CPP"
#include"LIBS/READ.CPP"
#include"LIBS/TYPE.CPP"
#include"LIBS/REND.CPP"
#include"LIBS/TYPE.CPP"
#include"EXTL/WIND.CPP"
#include"EXTL/HEAD.CPP"
#include"YXXY.CPP"
static int       BIRD_POTS = rand()%10+3;                //将小鸟位置绑定
static SDE       MENU_EVEN;                              //初始化事件对象
static IMGS      MENU_FKYPS[15];                         //创建主菜单方块
static IMGS      MENU_MENUS[ 8];                         //创建主菜单控件
static READ      MENU_LOADS("MAPS","MAP","MENU",1,5);    //读取主菜单配置
static IMGS      MENU_BIRDS;                             //创建主菜单小鸟
static TYPE      FKTP[6][4];                             //初始化渲染数据
static double    TIME_LAST = SDL_GetTicks();             //初始化上次时间
static double    TIME_LOOP = SDL_GetTicks();             //初始化当前时间
int MENU_INIT()
{
    for(int LOOP_A=1;LOOP_A<=7 ;LOOP_A++)        //读取菜单控件
        MENU_MENUS[LOOP_A].SETP("MENU",          //种类
                MENU_LOADS.DATA[LOOP_A][1],      //编号
                MENU_LOADS.DATA[LOOP_A][2],      //水平
                MENU_LOADS.DATA[LOOP_A][3],      //垂直
                MENU_LOADS.DATA[LOOP_A][4],      //宽度
                MENU_LOADS.DATA[LOOP_A][5]);     //高度
    for(int LOOP_T=0;LOOP_T<=14;LOOP_T++){       //设置方块状态
        MENU_FKYPS[LOOP_T].IMGS_IMGS_UPDO=1;     //向上
        MENU_FKYPS[LOOP_T].SETP("FKYP",          //种类
                   rand()%3+1+(rand()%5+1)*10,   //颜色
                               000+100*LOOP_T,   //水平
                               400+ 20*LOOP_T,   //垂直
                               81,511);}         //大小
    for(int LOOP_A= 0,LOOP_T=1;                  //设置类型数据
            LOOP_A<=5;LOOP_A++,LOOP_T++)
    for(int LOOP_B=1;LOOP_B<=3;LOOP_B++)
       FKTP[LOOP_A][LOOP_B].SETP(
            LOOP_A*10+LOOP_B,LOOP_T);
    BIRD_POTS = rand()%10+3;                     //小鸟位置绑定
    MENU_BIRDS.SETP("BIRD",01,440,000,71,57);    //拷贝小鸟图形
    YXXY_INIT();                                 //初始化分菜单
    return 0;

}
int MENU_UPDA(int count)
{
    if ((SDL_GetTicks() - TIME_LOOP) / 1 > 1)
    {
        for(int LOOP_TMPS=0;LOOP_TMPS<=14;LOOP_TMPS++)
        {
            if(MENU_FKYPS[LOOP_TMPS].IMGS_IMGS_POST.y==700) MENU_FKYPS[LOOP_TMPS].IMGS_IMGS_UPDO=-1;
            if(MENU_FKYPS[LOOP_TMPS].IMGS_IMGS_POST.y==450) MENU_FKYPS[LOOP_TMPS].IMGS_IMGS_UPDO= 1;
               MENU_FKYPS[LOOP_TMPS].SETP(MENU_FKYPS[LOOP_TMPS].IMGS_IMGS_POST.x,
               MENU_FKYPS[LOOP_TMPS].IMGS_IMGS_POST.y+MENU_FKYPS[LOOP_TMPS].IMGS_IMGS_UPDO,81,511);
        }
        TIME_LOOP = SDL_GetTicks();
    }
    if ((SDL_GetTicks() - TIME_LAST) / 1000 > 1)
    {
        DBUG_TFPS(count," RUNT_RENDER"," FPS");
        count = 0;
        TIME_LAST = SDL_GetTicks();
    }
    return 0;
}
int MENU_BIRD(int MENU_BIRD_POTS)
{
    MENU_BIRDS.SETP(
    MENU_FKYPS[MENU_BIRD_POTS].IMGS_IMGS_POST.x+12,
    MENU_FKYPS[MENU_BIRD_POTS].IMGS_IMGS_POST.y+
    MENU_FKYPS[MENU_BIRD_POTS].IMGS_IMGS_UPDO-57,
    71,57);
    return 0;
}
int MENU_PDAN(int MENU_PDAN_X,int MENU_PDAN_Y,int x1,int y1,int x2,int y2)
{
    if(MENU_PDAN_X<x1||MENU_PDAN_X>x1+x2) return 0;
    if(MENU_PDAN_Y<y1||MENU_PDAN_Y>y1+y2) return 0;
    return 1;
}
int MENU_DEAL()
{
    while (SDL_PollEvent(&MENU_EVEN))
    {
        if(MENU_EVEN.type==SDL_QUIT)
                           WIND_EXIT();         //关闭窗口
        if(MENU_EVEN.type==SDL_MOUSEBUTTONUP)
        {
            int MENU_EVENT_X=MENU_EVEN.button.x;
            int MENU_EVENT_Y=MENU_EVEN.button.y;
            if(MENU_PDAN(MENU_EVENT_X,
                         MENU_EVENT_Y,
                         452,300,
                         270,66)==1)
            {
                YXXY_INIT();
                YXXY_INFT();                    //闯关模式
                break;
            }
            if(MENU_PDAN(MENU_EVENT_X,
                         MENU_EVENT_Y,
                         760,300,
                         270,66)==1)
                  continue;                     //生存模式
        }
    }
    return 0;
}
int MENU_SHOW()
{
    for(int count=1;;count++)
    {
        REND_CLEN();                    //清空渲染
        for(int LOOP_A=1;LOOP_A<=7 ;LOOP_A++)
            MENU_MENUS[LOOP_A].SHOW();  //渲染菜单
        for(int LOOP_A=0;LOOP_A<=14;LOOP_A++)
            MENU_FKYPS[LOOP_A].SHOW();  //渲染方块
        MENU_BIRD(BIRD_POTS);           //绑定小鸟
            MENU_BIRDS        .SHOW();  //渲染小鸟
        REND_SHOW();                    //执行渲染
        MENU_DEAL();                    //处理事件
        MENU_UPDA(count);               //输出帧率
    }
}
#endif

选择菜单YXXY.CPP

#include"LIBS/IMGS.CPP"
#include"LIBS/REND.CPP"
#include"LIBS/FONT.CPP"
#include"EXTL/HEAD.CPP"
#include"EXTL/WIND.CPP"
#include"CGMS.CPP"
#include "SDL_ttf.h"

int  YXXY_XZFW[16][5];
int  YXXY_XZXZ[16][5];
SDE  YXXY_EVEN;
IMGS YXXY_BGMP[22];
IMGS YXXY_BGFA[16];
IMGS YXXY_STAR[11][4];
SAVE YXXY_DATA;
READ YXXY_DQFW;
READ YXXY_DQXZ;
READ YXXY_CHIL;
int BOTT_DEAL(int ix,int iy,int FTTL[16][5],int LTNS)  //获取鼠标按钮编号
{
    for(int LOOP=1;LOOP<=LTNS;LOOP++)
    {
        int PDSJ_FLAG=0;
        if(ix<FTTL[LOOP][1]
         ||ix>FTTL[LOOP][2])PDSJ_FLAG=1;
        if(iy<FTTL[LOOP][3]
         ||iy>FTTL[LOOP][4])PDSJ_FLAG=1;
        if(PDSJ_FLAG==0)    return LOOP;
    }
    return 0;
}

int YXXY_INIT()
{
    SDL_PollEvent(&YXXY_EVEN);//初始化事件
//---------------配置复制:一级菜单-------------------------
    for(int i=1;i<=YXXY_CHIL.LENS;i++)
    {
        YXXY_BGFA[i].SETP("INFA",
                YXXY_CHIL.DATA[i][1],
                YXXY_CHIL.DATA[i][2],
                YXXY_CHIL.DATA[i][3],
                YXXY_CHIL.DATA[i][4],
                YXXY_CHIL.DATA[i][5]);
        YXXY_BGFA[i].SHOW();
    }
//-----------------配置复制:按键检测------------------------
    YXXY_DQFW.SETP("CONF","POS","YXXY",01,4);
    YXXY_DQXZ.SETP("CONF","POS","YXXY",02,4);
    for(int LOOP=1;LOOP<=YXXY_DQFW.LENS;LOOP++)
    for(int LTMP=1;LTMP<=4;LTMP++)
        YXXY_XZFW[LOOP][LTMP]=YXXY_DQFW.DATA[LOOP][LTMP];
        YXXY_XZFW[   0][   0]=YXXY_DQFW.LENS;
    for(int LOOP=1;LOOP<=YXXY_DQXZ.LENS;LOOP++)
    for(int LTMP=1;LTMP<=4;LTMP++)
        YXXY_XZXZ[LOOP][LTMP]=YXXY_DQXZ.DATA[LOOP][LTMP];
        YXXY_XZXZ[   0][   0]=YXXY_DQXZ.LENS;
        YXXY_CHIL.SETP("MAPS","MAP","INFA",00,5);
//---------------载入图像:复制星星--------------------------
    for(int LOOP=1;LOOP<=10;LOOP++)
    for(int LTMP=1;LTMP<= 3;LTMP++)
        YXXY_STAR[LOOP][LTMP].SETP("STAR",01,362-87+87*LOOP,572+LTMP*35-35,32,31);
//-------------------------------------------------------

    return 0;
}

int YXXY_CHOC(int order)
{
    YXXY_DATA.INIT();
    SDE  CHOC_EVENT;
    SDL_PollEvent(&CHOC_EVENT);
    REND_CLEN();
    READ CHILD("MAPS","MAP","INFA",order,5);
    for(int i=1;i<=CHILD.LENS;i++)
    {
        YXXY_BGMP[i].SETP("INFA",                  //配置复制
                CHILD.DATA[i][1],
                CHILD.DATA[i][2],
                CHILD.DATA[i][3],
                CHILD.DATA[i][4],
                CHILD.DATA[i][5]);
        YXXY_BGMP[i].SHOW();
    }
    while(CHOC_EVENT.type!=SDL_QUIT)
    {
        for(int i=1;i<=CHILD.LENS;i++)
        YXXY_BGMP[i].SHOW();
        for(int LOOP=1;LOOP<=10;LOOP++)
        {
                for(int LTMP=1;LTMP<=YXXY_DATA.DASX[(order-1)*10+LOOP];LTMP++)
                YXXY_STAR[LOOP][LTMP].SHOW();
        }

        REND_SHOW();
        while (SDL_PollEvent(&CHOC_EVENT))
        {
            if(CHOC_EVENT.type==SDL_QUIT)
                WIND_EXIT();                         //关闭窗口
            if(CHOC_EVENT.type==SDL_MOUSEBUTTONUP)
            {
                CHOC_EVENT.type=SDL_KEYUP;
                int   YXXY_GXIT=
                      BOTT_DEAL(CHOC_EVENT.button.x,
                                CHOC_EVENT.button.y,
                                YXXY_XZXZ,
                                YXXY_XZXZ[0][0]);    //检测按键
                      if(YXXY_GXIT==0)break;
                      if(YXXY_GXIT==1)return 0;
                      else
                      {
                          int CGRT=1;
                          for(;CGRT==1;)
                          {
                              CGMS GAME;
                                   GAME.CGMS_INIT(YXXY_GXIT-2+order*10);
                              CGRT=GAME.CGMS_DEAL();
                              if (CGRT==2)return 2;
                              if (CGRT==3)break;
                          }
                      }


            }
        }
    }
    return 0;
}
int YXXY_INFT()
{
//-------------------------------------------------------
    REND_CLEN();
    while(YXXY_EVEN.type!=SDL_QUIT)
    {
        for(int i=1;i<=YXXY_CHIL.LENS;i++)    //渲染背景
            YXXY_BGFA[i].SHOW();
        REND_SHOW();                          //执行渲染
        while (SDL_PollEvent(&YXXY_EVEN))
        {
            if(YXXY_EVEN.type==SDL_QUIT)
                WIND_EXIT();                   //关闭窗口
            if(YXXY_EVEN.type==SDL_MOUSEBUTTONUP)
            {
                int YXXY_XZGQ=                 //判断点击区域
                BOTT_DEAL(YXXY_EVEN.button.x,
                          YXXY_EVEN.button.y,
                          YXXY_XZFW,
                          YXXY_XZFW[0][0]);    //关卡界面
                if(YXXY_XZGQ==0)break;         //无操作
                if(YXXY_XZGQ==5)return 0;      //返回上一层
                YXXY_EVEN.type=SDL_KEYUP;      //重置事件,防止段错误
                int CGRT=YXXY_CHOC(YXXY_XZGQ); //进入子菜单
                if(CGRT==2) return 2;          //强制返回
            }
        }
    }
    return 0;
}

游戏进程CGMS.CPP

#pragma once
#ifndef CGMS_CPP
#define CGMS_CPP

#include "LIBS/READ.CPP"
#include "LIBS/FKYP.CPP"
#include "LIBS/TYPE.CPP"
#include "LIBS/REND.CPP"
#include "LIBS/FONT.CPP"
#include "LIBS/SAVE.CPP"
#include "EXTL/WIND.CPP"
#include "EXTL/DBUG.CPP"
class CGMS
{
public:
   REND GAME_REND;       //渲染队列
   READ CGMS_PACN;       //过关背景
   READ CGMS_FACN;       //失败背景
   READ CGMS_PAMG;       //过关按钮
   FONT CGMS_TIME;       //时间文字
   FONT CGMS_OUTT;       //星级文字
   SAVE CGMS_SAVE;       //数据存档
    int LAST_TIME;       //上次时间
    int NOWN_TIME;       //当前时间
    int TOTA_TIME;       //总共时间
    int GAME_NUMS;       //游戏编号
    int CGMS_PART;       //回调参数
    int CGMS_GMPA[16][5];//通关图像
    int CGMS_GMFA[16][5];//失败图像
int CGMS_PDAN(int ix,int iy,int FTTL[16][5],int LTNS)//-----------------判断鼠标点击范围-----------------
{
    for(int LOOP=1;LOOP<=LTNS;LOOP++){              //如果在范围内,返回对应数组偏移量,对应CONF配置序列中的ID
            int PDSJ_FLAG=0;
            if(ix<FTTL[LOOP][1]||ix>FTTL[LOOP][2])  //横坐标
                PDSJ_FLAG=1;
            if(iy<FTTL[LOOP][3]||iy>FTTL[LOOP][4])  //纵坐标
                PDSJ_FLAG=1;
            if(PDSJ_FLAG==0)
                return LOOP;}
    return 0;
}
int CGMS_INIT(int CGMS_NUMS)                         //------------------初始化游戏内容------------------
    {
        //------------------配置复制:按键检测------------------------
            CGMS_PACN.SETP("CONF","POS","CGMS",01,4);
            CGMS_FACN.SETP("CONF","POS","CGMS",02,4);
            CGMS_PAMG.SETP("MAPS","MAP","PASS",00,05);
            for(int LOOP=1;LOOP<=CGMS_PACN.LENS;LOOP++)
            for(int LTMP=1;LTMP<=4;LTMP++)
                CGMS_GMPA[LOOP][LTMP]=CGMS_PACN.DATA[LOOP][LTMP];
                CGMS_GMPA[   0][   0]=CGMS_PACN.LENS;
            for(int LOOP=1;LOOP<=CGMS_FACN.LENS;LOOP++)
            for(int LTMP=1;LTMP<=4;LTMP++)
                CGMS_GMFA[LOOP][LTMP]=CGMS_FACN.DATA[LOOP][LTMP];
                CGMS_GMFA[   0][   0]=CGMS_FACN.LENS;
        //---------------------------------------------------------
        GAME_REND.INIT(CGMS_NUMS);
        LAST_TIME=(int)SDL_GetTicks();
        NOWN_TIME=(int)SDL_GetTicks();
        GAME_NUMS=CGMS_NUMS;
        TOTA_TIME=0;
        CGMS_TIME.SETP(255,255,255, 80, 50,100,50,(char*)"0.00"  ,72);
        CGMS_OUTT.SETP(255,255,255,750,350, 80,40,(char*)"9.99\"",72);
        return 0;
    }
//----------------------------闯关成功界面实现----------------------------
int CGMS_PASS()
{
    SDE  CGMA_PASS_EVEN;                             //创建事件
    int  CGMS_PASS_FLAG=1;                           //循环标识符
         IMGS CGMS_PASS_IGPA[16];                    //菜单图像
         IMGS CGMS_PASS_STAR[4];                     //三颗星图像
         CGMA_PASS_EVEN.type=SDL_KEYDOWN;            //初始化事件
         CGMS_TIME.SETP(1,200,100);                  //显示时间TTF大小重写
         CGMS_TIME.SETP(0,650,150);                  //显示时间TTF位置重写
    int  CGMS_PASS_SNUM=                             //获取等级
         CGMS_SAVE.EXPO(GAME_NUMS-9,TOTA_TIME);
    if(CGMS_PASS_SNUM>CGMS_SAVE.DASX[GAME_NUMS-9]){  //等级打破纪录
        CGMS_SAVE.DASX[GAME_NUMS-9]=CGMS_PASS_SNUM;  //更新等级
        CGMS_SAVE.WRIT();}                           //数据存盘
    if(CGMS_SAVE.PDDP(GAME_NUMS-9,TOTA_TIME)==true){ //时间打破纪录
        CGMS_SAVE.DAPX[GAME_NUMS-9]=TOTA_TIME;       //更新时间
        CGMS_SAVE.WRIT();}                           //数据存盘
    for (int LOOP=1;LOOP<=             3;LOOP++)     //载入星星
             CGMS_PASS_STAR[LOOP].SETP("STAR",
                 00,548+LOOP*73,279,57,54);
    for (int LOOP=1;LOOP<=CGMS_PAMG.LENS;LOOP++)     //载入背景
             CGMS_PASS_IGPA[LOOP].SETP("MENU",       //编号
                 CGMS_PAMG.DATA[LOOP][1],            //类型
                 CGMS_PAMG.DATA[LOOP][2],            //水平
                 CGMS_PAMG.DATA[LOOP][3],            //垂直
                 CGMS_PAMG.DATA[LOOP][4],            //宽度
                 CGMS_PAMG.DATA[LOOP][5]);           //高度
    while(CGMS_PASS_FLAG)//--------------------CGMS_PASS主体循环---------------------
    {
    STR STRS_TEMP;                                                         //三星时间
    STR STTM_TEMP;                                                         //实际时间
        REND_CLEN();                                                       //清空渲染
        for (int LOOP=1;LOOP<=CGMS_PAMG.LENS;LOOP++)                       //显示背景
              CGMS_PASS_IGPA[LOOP].SHOW();
        if(CGMS_PASS_SNUM>0)
        for (int LOOP=1;LOOP<=CGMS_PASS_SNUM;LOOP++)                       //显示星级
              CGMS_PASS_STAR[LOOP].SHOW();
        STRS_TEMP =to_string(TOTA_TIME/1000)+                              //时间字体
        STTM_TEMP =to_string(CGMS_SAVE.DARX[GAME_NUMS-9][3]/1000)          //三星字体
              +"."+to_string(CGMS_SAVE.DARX[GAME_NUMS-9][3]%1000/10)+"\"";
        CGMS_TIME.SETP((char*)STRS_TEMP.c_str());                          //设置时间
        CGMS_OUTT.SETP((char*)STTM_TEMP.c_str());                          //设置三星
        CGMS_OUTT.SHOW();                                                  //显示三星
        CGMS_TIME.SHOW();                                                  //显示时间
        REND_SHOW();
        while (SDL_PollEvent(&CGMA_PASS_EVEN))//------------事件处理循环--------------
        {
            if(CGMA_PASS_EVEN.type==SDL_QUIT){
                CGMS_PASS_FLAG=0;
                WIND_EXIT();}                              //退出程序
            if(CGMA_PASS_EVEN.type==SDL_MOUSEBUTTONUP){    //按下鼠标
            int CGMS_ANPA=
                CGMS_PDAN(CGMA_PASS_EVEN.button.x,         //鼠标-Y轴
                          CGMA_PASS_EVEN.button.y,         //鼠标-X轴
                          CGMS_GMPA,                       //传入数组
                          CGMS_GMPA[0][0]);                //区域长度
                if(CGMS_ANPA==0){CGMS_ANPA=-1;break;}      //无效点击
                else{
                    CGMS_PART=CGMS_ANPA;                   //回传参数
                    return CGMS_ANPA;}}
          }
     }//-----------------------------------------------------------------------------
     return 0;
}

int CGMS_FAIL(int DQJD)
    {
        SDE  CGMS_FAIL_EVEN;
        while (SDL_PollEvent(&CGMS_FAIL_EVEN))
        CGMS_FAIL_EVEN.type=SDL_KEYUP;
        IMGS FAIM[7];
        FAIM[1].SETP("FAIL",01,560,580,457,175);
        FAIM[2].SETP("FAIL",02,780,650,197, 85);
        FAIM[3].SETP("FAIL",03,575+DQJD,590, 23, 22);
        FAIM[4].SETP("MENU",12,590,650, 85, 85);
        FAIM[5].SETP("MENU",13,685,650, 85, 85);
        FAIM[6].SETP("MENU",21,640,150,300,150);
        while(CGMS_FAIL_EVEN.type!=SDL_QUIT)
       {

            for(int LOOP=1;LOOP<=6;LOOP++) FAIM[LOOP].SHOW();
            REND_SHOW();
            while (SDL_PollEvent(&CGMS_FAIL_EVEN))
            {
                if(CGMS_FAIL_EVEN.type==SDL_QUIT)
                {
                    WIND_EXIT();                                 //关闭窗口
                    break;
                }
                if(CGMS_FAIL_EVEN.type==SDL_MOUSEBUTTONUP)
                {
                CGMS_FAIL_EVEN.type=SDL_KEYUP;
                int CGMS_ANPA=
                    CGMS_PDAN(CGMS_FAIL_EVEN.button.x,
                              CGMS_FAIL_EVEN.button.y,
                              CGMS_GMFA,
                              CGMS_GMFA[0][0]);                  //关卡界面
                    if(CGMS_ANPA==0)
                    {
                            CGMS_ANPA=-1;
                            break;
                    }
                    else
                    {
                            CGMS_PART=CGMS_ANPA;
                            return CGMS_ANPA;
                    }
                  }

            }
       }
        return 0;
    }

int CGMS_SHOW()
    {
       int SHOW_TEMP;
       STR STRS_TEMP;
       int RTEN=GAME_REND.EXEC();
                GAME_REND.SHOW();
                CGMS_TIME.SHOW();

        if(RTEN== 0)//过关
        {
            SHOW_TEMP=CGMS_PASS();
            return SHOW_TEMP;
        }
        if(RTEN== 1)//计时
        {
            NOWN_TIME =SDL_GetTicks();
            if(NOWN_TIME-LAST_TIME>10)
            {
                TOTA_TIME+=NOWN_TIME-LAST_TIME;
                LAST_TIME =NOWN_TIME;
            }
            if(DBUG_OTIME==1)
            {
                cout<<" [CGMS] ";
                DBUG_GTIM();
                cout<<"0x"<<WIND_RENDP<<" "<<"GAME_PROEXE: "<<"~~|GAME|NOW_TIME_IS:";
                printf("%6.2f\n",(float)TOTA_TIME/1000);
            }
        }
        if(RTEN==-1)//暂停
        {
            NOWN_TIME =SDL_GetTicks();
            LAST_TIME =NOWN_TIME;
        }
        STRS_TEMP =to_string(TOTA_TIME/1000)+"."+to_string(TOTA_TIME%1000/10);
        CGMS_TIME.SETP((char*)STRS_TEMP.c_str());
        CGMS_TIME.SHOW();
        REND_SHOW();
        return 0;
}
int CGMS_NEXT()
    {
    if(DBUG_OTSTP==1)
    {
        cout<<" [NEXT] ";
        DBUG_GTIM();
        cout<<"0x"<<WIND_RENDP
            <<" "<<"NEXT_BIRDNS: "
            <<"~~|BIRD|NOW_BIRD_AT:"
            <<GAME_REND.NOWN+GAME_REND.BIRP
            <<endl;
    }

        if(
           GAME_REND.MAPS[GAME_REND.NOWN+GAME_REND.BIRP-1].NOWH>
           GAME_REND.MAPS[GAME_REND.NOWN+GAME_REND.BIRP  ].NOWH+10)
            return 1;
        if(  GAME_REND.BIRP<=7
           ||GAME_REND.TEMP.LENS-
            (GAME_REND.NOWN+
             GAME_REND.BIRP)<=6)
             GAME_REND.BIRP++;
        else GAME_REND.NOWN=GAME_REND.NOWN+1;
        return 0;
    }
int CGMS_DEAL()
{
    int DEAL_EXIT=1;
    int DEAL_CGRT;
    SDE DEAL_EVEN;
    while(DEAL_EXIT)
    {
        while (SDL_PollEvent(&DEAL_EVEN))
        {
            if(DEAL_EVEN.type==SDL_QUIT)WIND_EXIT();            //关闭窗口
            if(DEAL_EVEN.type==SDL_MOUSEBUTTONDOWN
             ||DEAL_EVEN.type==SDL_KEYDOWN)
                {
                if(CGMS_NEXT()==1&&DBUG_NOKIL == 0){
                        DEAL_CGRT = CGMS_FAIL((int)
                                    (GAME_REND.NOWN+
                                     GAME_REND.BIRP)
                                    /GAME_REND.TEMP.LENS*350);  //小鸟相撞
                    if(DEAL_CGRT==3){
                        TOTA_TIME=0;
                        int LOOP=GAME_REND.NOWN+GAME_REND.BIRP-1;
                        for(;LOOP>=2&&GAME_REND.MAPS[LOOP].TYPE>10;LOOP--);
                        GAME_REND.BIRP=1;
                        GAME_REND.NOWN=LOOP;}
                        else return DEAL_CGRT;}
                }
            }
            DEAL_CGRT =  CGMS_SHOW();
            if (DEAL_CGRT!=0)return DEAL_CGRT;
            SDL_Delay(16);
        }
        return 0;
    }
};

#endif

调试模式:DBUG.CPP

#pragma once
#ifndef DBUG_CPP
#define DBUG_CPP

#include "HEAD.CPP"
#include "windows.h"
int DBUG_INIT(int DBUG_INIT_ARGC,
            char* DBUG_INIT_ARGV[])//初始化调试模式,检测外部参数,设置渲染模式
{   system("mode con:cols=79 lines=60");
    if(DBUG_INIT_ARGC>=2)for (int DBUG_INIT_LOOP=1;DBUG_INIT_LOOP<DBUG_INIT_ARGC;DBUG_INIT_LOOP++)
    {
        if(DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='a'||DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='A')DBUG_ACCED = 0;
        if(DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='b'||DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='B')DBUG_SYNCD = 0;
        if(DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='c'||DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='C')DBUG_NOKIL = 1;
        if(DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='d'||DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='D')DBUG_DEBUG = 1;
        if(DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='e'||DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='E')DBUG_EEOOR = 1;
        if(DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='f'||DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='F')DBUG_OTFPS = 1;
        if(DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='g'||DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='G')DBUG_OTIME = 1;
        if(DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='h'||DBUG_INIT_ARGV[DBUG_INIT_LOOP][1]=='H')DBUG_OTSTP = 1;
    }
    if(DBUG_ACCED ==0 ) DBUG_GUPMD-=2;
    if(DBUG_SYNCD ==0 ) DBUG_GUPMD-=4;
    if(DBUG_DEBUG)cout<<"--------------------------------DEBUG MODE ON--------------------------------"<<endl;
    else          cout<<"--------------------------------DEBUG MODE OFF-------------------------------"<<endl;
    return 0;
}

int DBUG_GTIM()                     //---------------输出当前时间----------------
{
    time_t DBUG_OUTP_TIMP;
     time(&DBUG_OUTP_TIMP);
      char DBUG_OUTP_TIME[64];
    strftime(DBUG_OUTP_TIME,
      sizeof(DBUG_OUTP_TIME),
         "%Y-%m-%d %H:%M:%S",
  localtime(&DBUG_OUTP_TIMP) );
    cout<<DBUG_OUTP_TIME<<" ";
    return 0;
}

int DBUG_OUTP(void* DBUG_OUTP_PTRP,//
             string DBUG_OUTP_NAME,
             string DBUG_OUTP_TEXT)
{
    if(DBUG_DEBUG    ==0       && DBUG_EEOOR==0)
        return 0;
    if(DBUG_OUTP_PTRP!=nullptr && DBUG_DEBUG==0)
        return 0;
    if(DBUG_OUTP_PTRP!=nullptr && DBUG_DEBUG==1)
         cout<<" [OKAY] ";
    else cout<<" [FAIL] ";
    DBUG_GTIM();
    cout<<"0x"<<DBUG_OUTP_PTRP;
    cout<<DBUG_OUTP_NAME<<": ";
    cout<<DBUG_OUTP_TEXT<<endl;
        return 0;
}

int DBUG_TFPS(int DBUG_TFPS_NFPS,const string DBUG_OUTP_NAME,const string DBUG_OUTP_TEXT)
{
    if(DBUG_OTFPS==0)
        return 0;
    if(DBUG_TFPS_NFPS>=30)cout<<" [INFO] ";
    else                  cout<<" [WARN] ";
    DBUG_GTIM();
    cout<<"0x"<<WIND_RENDP<<DBUG_OUTP_NAME<<": "<<DBUG_TFPS_NFPS<<DBUG_OUTP_TEXT<<endl;
        return 0;
}

#endif

头文件EXTL/HEAD.CPP

#pragma once
#ifndef HEAD_CPP
#define HEAD_CPP
#include <iostream>
#include <string>
#include "SDL.h"
#include "SDL_image.h"
#include "SDL_ttf.h"
#include <time.h>
#define STR string
#define STP SDL_Texture*
#define SDP SDL_Rect
#define SDE SDL_Event
#define SDR SDL_Renderer
#define SDS SDL_Surface
#define SDW SDL_Window
#define SDC SDL_Color
#define SDA SDL_AudioSpec
#define TFT TTF_Font
#define TFO TTF_OpenFont

using namespace std;

static SDR*         WIND_RENDP = nullptr;      //渲染指针
static SDW*         WIND_WINDP = nullptr;      //窗口指针
static const char*  WIND_TITLE = "No Jumping"; //菜单标题
static const int    WIND_WIDTH = 1500;         //水平大小
static const int    WIND_HEIGH = 750;          //垂直大小
static const int    GAME_MAXHT = 450;          //方块上限
static const int    GAME_MINHT = 750;          //方块下限
static       int    DBUG_GUPMD = 0x00000006;   //渲染模式
static       int    DBUG_ACCED = 1;            //A显卡加速
static       int    DBUG_SYNCD = 1;            //B垂直同步
static       int    DBUG_NOKIL = 0;            //C作弊模式
static       int    DBUG_DEBUG = 0;            //D调试模式
static       int    DBUG_EEOOR = 1;            //E输出错误
static       int    DBUG_OTFPS = 0;            //F输出帧率
static       int    DBUG_OTIME = 0;            //G输出时间
static       int    DBUG_OTSTP = 0;            //H输出步数

#endif

窗口控制WIND.CPP

#pragma once
#ifndef WIND_CPP
#define WIND_CPP
#include"HEAD.CPP"
#include"DBUG.CPP"
int WIND_INIT(int DBUG_INIT_ARGC,char** DBUG_INIT_ARGV)
{
    /*------------------------------创建窗口------------------------------*/
    DBUG_INIT(DBUG_INIT_ARGC,DBUG_INIT_ARGV);
    if(SDL_Init(SDL_INIT_VIDEO)<0) return -1;
    WIND_WINDP=SDL_CreateWindow(WIND_TITLE,         //窗口标题
                            SDL_WINDOWPOS_UNDEFINED,//垂直位置
                            SDL_WINDOWPOS_UNDEFINED,//水平位置
                            WIND_WIDTH,             //窗口宽度
                            WIND_HEIGH,             //窗口高度
                            SDL_WINDOW_SHOWN        //显示窗口
                            );
    DBUG_OUTP(WIND_WINDP," LOAD_WINDOW","WIND_WINDP");//输出调试信息
    srand((unsigned)time(nullptr));                   //随机种子生成
    TTF_Init();                                       //字体初始化
    return 0;
}
int WIND_EXIT()
{
    /*------------------------------退出程序------------------------------*/
  SDL_DestroyRenderer(WIND_RENDP);                  //销毁渲染
    SDL_DestroyWindow(WIND_WINDP);                  //销毁窗口
    SDL_Quit();                                     //退出GUI
    system("taskkill /IM 奔跑吧*");                    //销毁进程
    system("taskkill /IM JUM*  ");                    //销毁进程
    system("taskkill /IM GAM*  ");                    //销毁进程
    system("EXIT.CMD");                             //销毁进程
    exit(0);                                        //退出程序
    return 0;
}
#endif

游戏库文件:【点击下载】

Last modification:April 4, 2023
If you think my article is useful to you, please feel free to appreciate