C++与SDL实现奔跑吧叽咔
CPP+SDL引擎实现
奔跑吧叽卡(No jumping)是游戏工作室Ticktock正式发布的第四款游戏
叽卡是一只不会飞也不会跳的小鸟,只会用柔软的肚皮向前走
环游世界是它最大的梦想,冰雪王国,月光之城,魔法森林……
现在我用C++与SDL渲染移植了这个游戏
项目地址:https://github.com/PIKACHUIM/PIKA-CPP-NoJumping
源代码文件
二进制文件
游戏截图
菜单界面:
游戏界面:
过关界面:
工程架构
入口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
游戏库文件:【点击下载】