上一篇主要讲了走迷宫小游戏的原理,链接如下:
这一篇我们讲一下程序是怎么实现的。
代码整体结构如下:
void maze_people_play(){
unsigned char key,key_flag = 0;
static unsigned char drt = 0;
||获取按键值
key = get_key();
if((key == DIRECTION_RIGHT)||(key == DIRECTION_DOWN)
||(key == DIRECTION_LEFT)||(key == DIRECTION_UP)){
drt = key;
key_flag = 1;
}
||小方块按照drt的方向前进
maze_people_run( drt);
||判断是否走到了十字路口或丁字路口
if(find_help_erar( drt )){
||小方块停止前进
maze_flag.people_run_flag = 0;
}
||有按键按下,则继续前进
if(1 == key_flag ){
||小方块继续前进
maze_flag.people_run_flag = 1;
}
}
下面我们讲 一下小方块前进函数
#define MAZE_PEOPLE_RUN_STEP 1
static void maze_people_run(uint8_t drt){
int8_t j;
||标志为1, 前进
if(maze_flag.people_run_flag){ //run
switch(drt){
case DIRECTION_RIGHT:
||右移一步
tPeopleRegion[0].tLocation.iX += MAZE_PEOPLE_RUN_STEP;
||判断是否走到屏幕外面
if(tPeopleRegion[0].tLocation.iX >= (240 - MAZE_PEOPLE_WIDTH)){
tPeopleRegion[0].tLocation.iX = (240 - MAZE_PEOPLE_WIDTH);
}
||判断是否碰到竖线
for(j=0; j <MAZE_DATA_L_NUM;j++){
if(((tPeopleRegion[0].tLocation.iX+MAZE_PEOPLE_WIDTH) > maze_data_L[j][0])
&&((tPeopleRegion[0].tLocation.iX+MAZE_PEOPLE_WIDTH) < (maze_data_L[j][0] + 2))
){
if(( (tPeopleRegion[0].tLocation.iY >= maze_data_L[j][1]) && (tPeopleRegion[0].tLocation.iY <= maze_data_L[j][2])) ||
(((tPeopleRegion[0].tLocation.iY+MAZE_PEOPLE_WIDTH) >= maze_data_L[j][1])
&& ((tPeopleRegion[0].tLocation.iY+MAZE_PEOPLE_WIDTH) <= maze_data_L[j][2]))){
tPeopleRegion[0].tLocation.iX -= MAZE_PEOPLE_RUN_STEP;
return;
}
}
}
||判断是否碰到横线
for(j=0; j <MAZE_DATA_H_NUM;j++){
if(((tPeopleRegion[0].tLocation.iX+MAZE_PEOPLE_WIDTH) > maze_data_H[j][0])
&& ((tPeopleRegion[0].tLocation.iX+MAZE_PEOPLE_WIDTH) < (maze_data_H[j][0] + 2))){
if((((tPeopleRegion[0].tLocation.iY) > (maze_data_H[j][1] )) && ((tPeopleRegion[0].tLocation.iY) < (maze_data_H[j][1] + MAZE_LINE_WIDTH_HIGH)))
||(((tPeopleRegion[0].tLocation.iY+MAZE_PEOPLE_WIDTH) > (maze_data_H[j][1] ))
&& ((tPeopleRegion[0].tLocation.iY+MAZE_PEOPLE_WIDTH) < (maze_data_H[j][1] + MAZE_LINE_WIDTH_HIGH)))
||(((tPeopleRegion[0].tLocation.iY) <= (maze_data_H[j][1] ))
&& ((tPeopleRegion[0].tLocation.iY+MAZE_PEOPLE_WIDTH) >= (maze_data_H[j][1] + MAZE_LINE_WIDTH_HIGH)))){
tPeopleRegion[0].tLocation.iX -= MAZE_PEOPLE_RUN_STEP;
return;
}
}
}
break;
case DIRECTION_DOWN:
...
break;
case DIRECTION_LEFT:
...
break;
case DIRECTION_UP:
...
break;
}
}
}
我们只讲一下右移的代码,其他方向原理都是一样的
maze_flag.people_run_flag标志为1时,才进行移动,否则不移动。
右移一步就是小方块的x坐标加1,
tPeopleRegion[0].tLocation.iX += MAZE_PEOPLE_RUN_STEP;
右移后首先判断是否移到了屏幕外面,如果是,则退回来,
否则继续判断是否碰到竖线。
碰到竖线检测的原理如下图所示:
如图,右移碰到竖线的前两种情况判断条件一样
如果条件成立,则再把小方块的x值减1(相当于没有移动即停止)
tPeopleRegion[0].tLocation.iX -= MAZE_PEOPLE_RUN_STEP;
这就是碰到竖线就停止的原理。
右移碰到横线的检测原理如下图:
这就是方块碰到横线时的3种判断情况。
如果条件成立,则再把小方块的x值减1(相当于没有移动即停止)
tPeopleRegion[0].tLocation.iX -= MAZE_PEOPLE_RUN_STEP;
到此,小方块移动的原理就讲完了。
下一篇我们就开始讲遇到十字路口和丁字路口停止的代码。
原创不易,如果你喜欢我的公众号、觉得我 文章对你有所启发,
请务必“点赞、收藏、转发”,这对我很重要,谢谢!
欢迎订阅 嵌入式小书虫