嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > 走迷宫小游戏源码篇之上下左右移动

走迷宫小游戏源码篇之上下左右移动


上一篇主要讲了走迷宫小游戏的原理,链接如下:


这一篇我们讲一下程序是怎么实现的。

代码整体结构如下:

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 1static 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;


到此,小方块移动的原理就讲完了。

下一篇我们就开始讲遇到十字路口和丁字路口停止的代码。



原创不易,如果你喜欢我的公众号、觉得我 文章对你有所启发,

请务必“点赞、收藏、转发”,这对我很重要,谢谢!

欢迎订阅    嵌入式小书虫