4041|4

554

帖子

3

TA的资源

纯净的硅(初级)

楼主
 

STM32F769I-DISCO评测【6】——简单的模拟打地鼠游戏 [复制链接]

本帖最后由 xinmeng_wit 于 2016-12-27 13:32 编辑

这一篇我就分享一下我的基于STM32F769I-DISCO的打地鼠游戏,其实不能称作一个游戏,只是简单的模拟一下打地鼠的功能。
需要用到的资源有:
一、LCD;
二、触摸屏;
三、定时器;
四、LED。

打地鼠游戏相信各位大神小时候都玩过,就是每次冒出一个地鼠,需要去敲击冒出来的地鼠,如果敲中了则得分+1,没敲中则不得分,最后看总分,每一关会设定一个时间,关卡越大,地鼠出现的频率越快,难度越大。

功能描述:
1、游戏也是用关卡的方式,一关比一关难(地鼠出现的频率逐渐增加);
2、能显示得分和关卡数,每击中一个加一分,不击或未击中则不得分,同时也不减分;
3、游戏设置有一个暂停键和一个退出键,游戏过程中按下暂停键则游戏暂停,同时按键会变为开始键,若再按下开始键则游戏继续,同时屏幕下方会有文字提示目前所处的状态。若按下退出键则直接退出游戏,同时屏幕也会有相应的提示信息。
4、每关结束后,屏幕会显示当前的得分和关卡数,同时有2个按键,一个按键是“进入下一关”,另一个按键是“退出”,如进入下一关则游戏继续,若退出则游戏中止直接退出。
5、目前没有关卡限制,理论上可以一直玩下去,但是后面地鼠速度太快,完全击不中。


关于程序代码:

工程是直接在HAL库的例程里做的修改,没有单独自己建工程,选用的工程是BSP的工程,因为里面已经包含的lcd和触摸屏的代码,修改起来容易很多。工程路径:..\STM32_FW_F7_V1.5.0\Projects\STM32F769I-Discovery\Examples\BSP\MDK-ARM



下面只介绍一下主要的代码:
主函数:
  1. int main(void)
  2. {
  3.   uint8_t  lcd_status = LCD_OK;
  4.   
  5.   /* Configure the MPU attributes as Write Through */
  6.   MPU_Config();

  7.   /* Enable the CPU Cache */
  8.   CPU_CACHE_Enable();

  9.   HAL_Init();
  10.   
  11.   /* Configure the system clock to 200 MHz */
  12.   SystemClock_Config();
  13.   
  14.   BSP_LED_Init(LED_GREEN);
  15.   BSP_LED_Init(LED_RED);
  16.   
  17.   /* Configure the Tamper push-button in GPIO Mode */
  18.   BSP_PB_Init(BUTTON_WAKEUP, BUTTON_MODE_GPIO);

  19.   /* Initialize the LCD */
  20.   lcd_status = BSP_LCD_Init();
  21.   while(lcd_status != LCD_OK);
  22.   
  23.   BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
  24.   
  25.   BSP_LCD_Clear(LCD_COLOR_WHITE);
  26.   Display_DemoDescription();
  27.   HAL_Delay(1000);
  28.   BSP_LCD_Clear(LCD_COLOR_WHITE);//清屏
  29.   
  30.   BSP_LCD_DisplayStringAt(17*7+17*7, 240+24, (uint8_t *)"score:00", LEFT_MODE);//显示游戏得分
  31.   BSP_LCD_DisplayStringAt(17*7+17*8+17*9, 240+24, (uint8_t *)"round:1", LEFT_MODE);//显示游戏局数
  32.   
  33.   BSP_LCD_SetTextColor(LCD_COLOR_CYAN);
  34.   BSP_LCD_DrawRect(17*7-7+17*8, 240+24-8+30+24*2, 100 , 40);//start按键
  35.   BSP_LCD_FillRect(17*7-7+17*8, 240+24-8+30+24*2, 100 , 40);//start按键填充
  36.   
  37.   BSP_LCD_DrawRect(17*7-7+17*10+17*8, 240+24-8+30+24*2, 100 , 40);//exit按键
  38.   BSP_LCD_FillRect(17*7-7+17*10+17*8, 240+24-8+30+24*2, 100 , 40);//exit按键填充
  39.   
  40.   BSP_LCD_SetTextColor(LCD_COLOR_RED);
  41.   BSP_LCD_SetBackColor(LCD_COLOR_CYAN);
  42.   BSP_LCD_DisplayStringAt(17*7+17*8, 240+24+30+24*2, (uint8_t *)"PAUSE", LEFT_MODE);//显示暂停按键85*24
  43.   BSP_LCD_DisplayStringAt(17*7-7+17*10+7+17*8, 240+24-8+30+24*2+8, (uint8_t *)"EXIT", LEFT_MODE);//显示退出按键85*24
  44.   BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
  45.   BSP_LCD_DisplayStringAt(17*3, 460, (uint8_t *)"Please press the button "PAUSE" to pause!", LEFT_MODE);//显示提示信息

  46.   TIM3_Init(20000-1,10800-1);//初始化定时器3
  47.   while (1)
  48.   {
  49.         Touchscreen_demo1();//触摸屏函数
  50.         if(timer_count==0)
  51.         {
  52.                 BSP_LCD_Clear(LCD_COLOR_WHITE);//清屏
  53.                 BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);//设置文本颜色
  54.                 BSP_LCD_SetBackColor(LCD_COLOR_WHITE);//设置背景颜色
  55.                 BSP_LCD_DisplayStringAt((BSP_LCD_GetXSize()-17*8)/2, 24*7, (uint8_t *)"score:", LEFT_MODE);//显示得分
  56.                 des_score[0]=score/10+'0';
  57.                 des_score[1]=score%10+'0';
  58.                 des_score[2]='\0';
  59.                 BSP_LCD_DisplayStringAt((BSP_LCD_GetXSize()-17*8)/2+17*6, 24*7,des_score, LEFT_MODE);//显示具体得分

  60.                 BSP_LCD_DisplayStringAt((BSP_LCD_GetXSize()-17*7)/2, 24*9, (uint8_t *)"round:", LEFT_MODE);//显示游戏局数
  61.                 des_score[0]=game_round%10+'0';
  62.                 des_score[1]='\0';
  63.         
  64.                 BSP_LCD_DisplayStringAt((BSP_LCD_GetXSize()-17*7)/2+17*6, 24*9,des_score , LEFT_MODE);//显示具体局数

  65.                 BSP_LCD_SetTextColor(LCD_COLOR_CYAN);
  66.                 BSP_LCD_SetBackColor(LCD_COLOR_CYAN);
  67.                 BSP_LCD_DrawRect(17*7-7+17*3, 240+24-8+30+24*2, 204 , 40);//next round按键
  68.                 BSP_LCD_FillRect(17*7-7+17*3, 240+24-8+30+24*2, 204 , 40);//next round按键填充

  69.                 BSP_LCD_DrawRect(17*7-7+17*10+17*8, 240+24-8+30+24*2, 100 , 40);//exit按键
  70.                 BSP_LCD_FillRect(17*7-7+17*10+17*8, 240+24-8+30+24*2, 100 , 40);//exit按键填充

  71.                 BSP_LCD_SetTextColor(LCD_COLOR_RED);
  72.                 BSP_LCD_SetBackColor(LCD_COLOR_CYAN);
  73.                 BSP_LCD_DisplayStringAt(17*7-7+17*4, 240+24+30+24*2, (uint8_t *)"NEXT ROUND", LEFT_MODE);//85*24
  74.                 BSP_LCD_DisplayStringAt(17*7-7+17*10+7+17*8, 240+24-8+30+24*2+8, (uint8_t *)"EXIT", LEFT_MODE);//85*24               
  75.                 timer_count=-1;
  76.                 ts_flag=-1;
  77.                 last_ts_flag=-2;
  78.         }               
  79.          
  80.   }
  81. }
复制代码

主函数主要是对相关资源的初始化,然后是显示一些相关的信息,如得分和关卡数,还有就是按键的绘制,另外地鼠图标我是直接使用的st的logo,while(1)循环里主要是触摸屏扫描和显示相关信息。

再看看Touchscreen_demo1()函数,这个是触摸屏扫描处理函数,按键的操作都是在这里面处理的。
  1. void Touchscreen_demo1(void)
  2. {
  3.   uint16_t x1, y1;
  4.   uint8_t state = 0;
  5.   uint8_t exitTsUseCase = 0;
  6.   uint32_t ts_status = TS_OK;

  7.   /* Reset touch data information */
  8.   BSP_TEST_APPLI_ASSERT(BSP_TS_ResetTouchData(&TS_State));

  9.   /* Touchscreen initialization */
  10.   ts_status = BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize());

  11.   if(ts_status == TS_OK)
  12.   {
  13.     /* Display touch screen demo description */
  14.     //Touchscreen_SetHint_Demo(TOUCHSCREEN_DEMO_1);
  15.     //Touchscreen_DrawBackground_Circles(state);

  16. //    while (exitTsUseCase == 0)
  17. //    {
  18.       if (ts_status == TS_OK)
  19.       {
  20.         /* Check in polling mode in touch screen the touch status and coordinates */
  21.         /* of touches if touch occurred                                           */
  22.         ts_status = BSP_TS_GetState(&TS_State);
  23.         if(TS_State.touchDetected)
  24.         {
  25.           /* One or dual touch have been detected          */
  26.           /* Only take into account the first touch so far */

  27.           /* Get X and Y position of the first touch post calibrated */
  28.           x1 = TS_State.touchX[0];
  29.           y1 = TS_State.touchY[0];
  30.                 if(timer_count!=-1)
  31.                 {
  32.                         if((y1>65)&&(y1<65+80))
  33.                         {
  34.                                 if((x1>num*100)&&(x1<num*100+80))
  35.                                 {
  36.                                         if(pause==0)//非暂停
  37.                                         {
  38.                                                 if(ts_flag!=last_ts_flag)
  39.                                                 {
  40.                                                         score++;
  41.                                                         des_score[0]=score/10+'0';
  42.                                                         des_score[1]=score%10+'0';
  43.                                                         des_score[2]='\0';
  44.                                                         BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
  45.                                                         BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
  46.                                                         BSP_LCD_DisplayStringAt(17*7+17*7+17*6, 240+24,des_score, LEFT_MODE);
  47.                                                         BSP_LCD_DisplayStringAt((BSP_LCD_GetXSize()-13*17)/2, 170, (uint8_t *)"Good,score +1", LEFT_MODE);
  48.                                                         last_ts_flag=ts_flag;
  49.                                                 }                                
  50.                                         }

  51.                                        

  52.                                 }
  53.                         }
  54.                         else if((y1>240+24+30+24*2)&&(y1<240+24+30+24*2+40))
  55.                         {
  56.                                 if((x1>17*7-7+17*8)&&(x1<17*7-7+17*8+100))
  57.                                 {
  58.                                         if(start!=last_start)
  59.                                         {
  60.                                                 if(start==0)
  61.                                                 {
  62.                                                         start=1;//开始标志
  63.                                                         BSP_LCD_SetTextColor(LCD_COLOR_RED);
  64.                                                         BSP_LCD_SetBackColor(LCD_COLOR_CYAN);
  65.                                                         BSP_LCD_DisplayStringAt(17*7+17*8, 240+24+30+24*2, (uint8_t *)"PAUSE", LEFT_MODE);//85*24
  66.                                                         BSP_LCD_SetTextColor(LCD_COLOR_RED);
  67.                                                         BSP_LCD_SetBackColor(LCD_COLOR_WHITE);                                                
  68.                                                         BSP_LCD_DisplayStringAt(17*3, 460, (uint8_t *)"Please press the button "PAUSE" to pause!  ", LEFT_MODE);//85*24
  69.                                                         //HAL_TIM_Base_Start_IT(&TIM3_Handler);
  70.                                                         pause=0;
  71.                                                 }
  72.                                                 else
  73.                                                 {
  74.                                                         start=0;//暂停标志
  75.                                                         BSP_LCD_SetTextColor(LCD_COLOR_RED);
  76.                                                         BSP_LCD_SetBackColor(LCD_COLOR_CYAN);
  77.                                                         BSP_LCD_DisplayStringAt(17*7+17*8, 240+24+30+24*2, (uint8_t *)"START", LEFT_MODE);//85*24
  78.                                                         BSP_LCD_SetTextColor(LCD_COLOR_RED);
  79.                                                         BSP_LCD_SetBackColor(LCD_COLOR_WHITE);                                                
  80.                                                         BSP_LCD_DisplayStringAt(17*3, 460, (uint8_t *)"Please press the button "START" to restart!", LEFT_MODE);//85*24                                                
  81.                                                         //HAL_TIM_Base_Stop_IT(&TIM3_Handler);
  82.                                                         pause=1;
  83.                                                 }
  84.                                                 last_start=start;
  85.                                                         
  86.                                         }                                
  87.                                 }
  88.                                 if((x1>17*7-7+17*10+17*6)&&(x1<17*7-7+17*10+17*6+100))
  89.                                 {
  90.                                         BSP_LCD_Clear(LCD_COLOR_WHITE);//清屏
  91.                                         BSP_LCD_SetTextColor(LCD_COLOR_RED);
  92.                                         BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
  93.                                         BSP_LCD_DisplayStringAt(17*2, 240, (uint8_t *)"Please press the button "reset" to restart!", LEFT_MODE);//85*24
  94.                                         pause=1;
  95.                                 }

  96.                         }               
  97.                 }
  98.                 else
  99.                 {
  100.                         if(last_ts_flag!=ts_flag)
  101.                         {
  102.                                 if((y1>240+24-8+30+24*2)&&(y1<240+24-8+30+24*2+40))
  103.                                 {
  104.                                         if((x1>17*7-7+17*3)&&(x1<17*7-7+17*3+204))
  105.                                         {

  106.                                                 Timer_Count-=3000;
  107.                                                 timer_count=10;
  108.                                                 pause=0;
  109.                                                 game_round++;
  110.                                                 BSP_LCD_Clear(LCD_COLOR_WHITE);//清屏
  111.                                                 BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
  112.                                                 BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
  113.                                                 BSP_LCD_DisplayStringAt(17*7+17*7, 240+24, (uint8_t *)"score:", LEFT_MODE);

  114.                                                 des_score[0]=score/10+'0';
  115.                                                 des_score[1]=score%10+'0';
  116.                                                 des_score[2]='\0';
  117.                                                 //BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
  118.                                                 BSP_LCD_DisplayStringAt(17*7+17*7+17*6, 240+24,des_score, LEFT_MODE);

  119.                                                 BSP_LCD_DisplayStringAt(17*7+17*8+17*9, 240+24, (uint8_t *)"round:", LEFT_MODE);
  120.                                                 des_score[0]=game_round%10+'0';
  121.                                                 des_score[1]='\0';
  122.                                                 //BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
  123.                                                 BSP_LCD_DisplayStringAt(17*7+17*8+17*9+17*6, 240+24,des_score, LEFT_MODE);

  124.                                                 BSP_LCD_SetTextColor(LCD_COLOR_CYAN);
  125.                                                 BSP_LCD_DrawRect(17*7-7+17*8, 240+24-8+30+24*2, 100 , 40);//start按键
  126.                                                 BSP_LCD_FillRect(17*7-7+17*8, 240+24-8+30+24*2, 100 , 40);//start按键填充

  127.                                                 BSP_LCD_DrawRect(17*7-7+17*10+17*8, 240+24-8+30+24*2, 100 , 40);//exit按键
  128.                                                 BSP_LCD_FillRect(17*7-7+17*10+17*8, 240+24-8+30+24*2, 100 , 40);//exit按键填充
  129.                                                 BSP_LCD_SetTextColor(LCD_COLOR_RED);
  130.                                                 BSP_LCD_SetBackColor(LCD_COLOR_CYAN);
  131.                                                 BSP_LCD_DisplayStringAt(17*7+17*8, 240+24+30+24*2, (uint8_t *)"PAUSE", LEFT_MODE);//85*24
  132.                                                 BSP_LCD_DisplayStringAt(17*7-7+17*10+7+17*8, 240+24-8+30+24*2+8, (uint8_t *)"EXIT", LEFT_MODE);//85*24
  133.                                                 TIM3_Init(Timer_Count-1,10800-1);
  134.                                                 last_ts_flag=ts_flag;

  135.                                         }
  136.                                         if((x1>17*7-7+17*10+17*8)&&(x1<17*7-7+17*10+17*8+100))
  137.                                         {
  138.                                                 BSP_LCD_Clear(LCD_COLOR_WHITE);//清屏
  139.                                                 BSP_LCD_SetTextColor(LCD_COLOR_RED);
  140.                                                 BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
  141.                                                 BSP_LCD_DisplayStringAt(17*2, 240, (uint8_t *)"Please press the button "reset" to restart!", LEFT_MODE);//85*24
  142.                                                 pause=1;                                                
  143.                                         }
  144.                                 }                        
  145.                         }

  146.                 }

  147.         } /* of if(TS_State.TouchDetected) */

  148.       } /* of if (ts_status == TS_OK) */

  149.       /* Wait for a key button press to switch to next test case of BSP validation application */
  150.       /* Otherwise stay in the test */
  151. //      exitTsUseCase = CheckForUserInput();

  152. //      HAL_Delay(20);

  153.   //  } /* of while (exitTsUseCase == 0) */

  154.   } /* of if(status == TS_OK) */
  155. }
复制代码

都有相应的注释,语句都没有封装成函数,可能看起来比较乱,后面再修改升级。

另外,还要说一下非常关键的函数,rand()函数,地鼠的出现是随机的,rand()函数就是产生随机数的函数,rand()%8就是生成0~7的随机数,通过随机数来决定地鼠出现的位置。

随机数的产生是在定时器的中断函数里被调用的::
  1. //定时器3中断服务函数调用
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  3. {
  4.     if(htim==(&TIM3_Handler))
  5.     {
  6.                
  7.                 if(pause==0)
  8.                 {
  9.                         if(timer_count>0)//控制每局的地鼠个数
  10.                         {
  11.                                 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
  12.                                   BSP_LCD_FillRect(num*100, 65, 80, 80);
  13.                                   num=rand()%8;
  14.                                         while(num==ts_flag)
  15.                                         {
  16.                                                 num=rand()%8;
  17.                                         }
  18.                                        
  19.                                         ts_flag=num;
  20.                                         BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
  21.                                 BSP_LCD_DisplayStringAt((BSP_LCD_GetXSize()-13*17)/2, 170, (uint8_t *)"             ", LEFT_MODE);
  22.                                   BSP_LCD_DrawBitmap(num*100, 65, (uint8_t *)stlogo);        
  23.                                         timer_count--;               
  24.                         }
  25.                         
  26.                         if(timer_count==0)
  27.                         {
  28.                                 timer_count=0;
  29.                                 BSP_LCD_SetTextColor(LCD_COLOR_RED);
  30.                                 BSP_LCD_DisplayStringAt((BSP_LCD_GetXSize()-13*17)/2, 170, (uint8_t *)"game over", LEFT_MODE);
  31.                         }
  32.                
  33.                 }                        

  34.                         last_start=-1;
  35.     }
  36. }
复制代码

核心的代码就是这些,下面上几张图片看看效果:









视频:




点击此处,查看STM32F769I开发板官方资源。
查看本帖全部内容,请登录或者注册
此帖出自stm32/stm8论坛

最新回复

记得是自带的例程  详情 回复 发表于 2016-12-26 21:50
点赞 关注
 

回复
举报

1158

帖子

2

TA的资源

版主

沙发
 
可以选择上传到优酷,然后加进来
此帖出自stm32/stm8论坛

点评

没用过优酷啊,今天试试  详情 回复 发表于 2016-12-27 06:36
 
 

回复

2721

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
记得是自带的例程
此帖出自stm32/stm8论坛

点评

打地鼠吗?  详情 回复 发表于 2016-12-27 06:37
 
 

回复

554

帖子

3

TA的资源

纯净的硅(初级)

4
 


没用过优酷啊,今天试试
此帖出自stm32/stm8论坛
 
 
 

回复

554

帖子

3

TA的资源

纯净的硅(初级)

5
 


打地鼠吗?
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表