搜索

[RISC-V MCU 应用开发] 【原创】 【RISC-V MCU CH32V103测评】跑酷类小游戏的升级改造

[复制链接]
141|5
 楼主 | 2020-11-22 22:52 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2020-12-14 18:01 编辑

最近见网友们对跑酷类小游戏的兴趣正浓,便不免也想来凑个热闹,以前它是在单色OLED屏上实现的,于是便用手头的单色屏看来了一下效果,见图1和图2所示。

1.jpg
图1跳跃障碍中


2.jpg
图2 游戏结束

可能是屏幕的分辨率相对较小吧,游戏的界面显示的不太完整,于是将显示屏换成了手头分辨率相对高一点的双色OLED屏。
更换后,其显示效果如图3和图4所示,是不是效果明显提高了许多?

3.jpg
图3 跳跃障碍中

4.jpg

图4 游戏结束

为了游戏在整体上更完整,又使用汉字显示函数为游戏添加了封面效果。
提取字模所用的工具软件为PCtoLCD2002,见图5所示,完成后的界面如图6所示。
5.jpg

图5 提取字模

6.jpg

图6 游戏封面

兴之所至,不免觉得在哪些地方还是尚有不足的地方,在哪里?
有了色彩,有了游戏情节,还缺啥?
背景音乐呗!
要添加背景音乐这不难,咱有MP3播放模块呀!
只是缺少,合适的游戏类背景音乐,那就只好用歌曲来临时将就吧。
要添加背景音乐,完全不影响游戏的流畅性,因为MP3播放模块是靠串行通讯的指令来控制,MP3音乐的播放与游戏的运行完全是并行的,可谓是井水、河水各不相犯。
CH32V103有3个串口可供使用,选哪个来用呢?
从方便性来讲,还是使用串口1比较方便,因为串口1原本就是来供调试之用,既能轻松地输出字符串,也能方便地发送字节数据。
MP3播放模块的引脚排列如图7所示,其实除了电源引脚之外,真正要用的引脚是在有限。
SPK_1和SPK_2是连接喇叭的,RX是用来接收串口指令的,BUSY是指示MP3模块是否处于播放状态,而IO_2是触发播放下一首歌曲。

7.jpg
图7  模块引脚排列

其实,但从配置背景音乐的角度讲,只需1个I/O口即可,也就是在游戏开始后触发音乐播放。
而之所以选用串口控制是因为,它比按键控制模式在功能上更丰富,有利于游戏功能的进一步扩展。
例如,在串口控制模式下,当游戏结束时可以通过指令关闭背景音乐;当游戏通关后,可以通过指令更好背景音乐等,这是键控模式所不能企及的。
在游戏设计中,所用的的MP3播放指令有:
uint8_t cmd[]  = {0X7E, 0xFF, 0x06, 0X0D, 0X00, 0X00, 0X00,0xFE, 0xEE, 0XEF};  //play
uint8_t cmd1[] = {0X7E, 0xFF, 0x06, 0X01,0X00, 0X00, 0X00, 0xFE, 0xFA, 0XEF};  //next
uint8_t cmd5[] = {0X7E, 0xFF, 0x06, 0X16,0X00, 0X00, 0X00, 0xFE, 0xE5, 0XEF};  //stop
实现游戏功能的主程序为:
  1. int main(void)
  2. {
  3. uint8_t i;
  4. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  5. Delay_Init();
  6. //USART1  A.9 A.10
  7. USART_Printf_Init(9600);
  8. TIM3_Int_Init(359, 199);
  9. TIM_Cmd(TIM3, DISABLE); //TIM3
  10. Touch_Key_Init();
  11. OLED_Init();              //初始化OLED
  12. OLED_Clear();
  13. //显示游戏名称
  14. OLED_ShowCHinese(5,1,1);
  15. OLED_ShowCHinese(21,1,0);
  16. OLED_ShowCHinese(37,1,2);
  17. OLED_ShowCHinese(53,1,3);
  18. OLED_ShowCHinese(69,1,4);
  19. OLED_ShowCHinese(85,1,5);
  20. //音量设置
  21. setVolume(26);
  22. for(i=0;i<10;i++)
  23. {
  24. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  25. USART_SendData(USART1, cmd6[i]);
  26. }
  27. Delay_Ms(200);
  28. //歌曲设置
  29. playn(2);
  30. for(i=0;i<10;i++)
  31. {
  32. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  33. USART_SendData(USART1, cmd3[i]);
  34. }
  35. Delay_Ms(1000);
  36. while(1)
  37. {
  38. KeyScan();
  39. if(start_flag == 1)
  40. {
  41. OLED_ShowLine(0, 3, 128, data_ob);
  42. OLED_ShowPeople(30, start_jump, 3, start_jump_flag);
  43. show_num();
  44. game_over();
  45. }
  46. else if(start_flag == 2)
  47. {
  48. OLED_ShowString(24,1,"GAME OVER",9);
  49. start_flag = 0;
  50. for(i=0;i<10;i++)
  51. {
  52. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  53. USART_SendData(USART1, cmd5[i]);
  54. }
  55. }
  56. }
  57. }
复制代码

完成游戏功能的整体构成如图8所示,所使用的存储卡则是512MB的T卡。
8.jpg

图8 游戏封面

既然双色OLED屏能提升游戏的效果,那换做彩色屏呢,是不是又能产生出新的契机呢?有时间的话,不妨一试。哈哈,实在没想到在CH32V103的测评中竟趟进了游戏的门,真是一件乐事呀!


CH32V103 升级酷跑类小游戏.rar

592.16 KB, 下载次数: 0

使用特权

评论回复
| 2020-11-25 14:59 | 显示全部楼层
上次是哪个大神放了个酷跑的演示?不是同一个人吧!https://bbs.21ic.com/icview-3047188-1-1.html,期待源码啊

使用特权

评论回复
 楼主 | 2020-11-26 00:24 | 显示全部楼层
gyh974 发表于 2020-11-25 14:59
上次是哪个大神放了个酷跑的演示?不是同一个人吧!https://bbs.21ic.com/icview-3047188-1-1.html,期待源 ...

不是这个链接

使用特权

评论回复
 楼主 | 2020-11-26 00:28 | 显示全部楼层
gyh974 发表于 2020-11-25 14:59
上次是哪个大神放了个酷跑的演示?不是同一个人吧!https://bbs.21ic.com/icview-3047188-1-1.html,期待源 ...

是这位兄弟的:https://bbs.21ic.com/forum.php?mod=viewthread&tid=3048654&page=1#pid11643484

使用特权

评论回复
| 2020-11-26 10:42 | 显示全部楼层
jinglixixi 发表于 2020-11-26 00:28
是这位兄弟的:https://bbs.21ic.com/forum.php?mod=viewthread&tid=3048654&page=1#pid11643484

膜拜大神,这个角色可以变成一个小恐龙吗?

使用特权

评论回复
 楼主 | 2020-11-26 12:51 | 显示全部楼层
本帖最后由 jinglixixi 于 2020-11-26 20:58 编辑
gyh974 发表于 2020-11-26 10:42
膜拜大神,这个角色可以变成一个小恐龙吗?

理论上没问题,但要看角色更换后的响应速度,毕竟一个小恐龙的图案规格要比一个圆球的尺寸大,但不妨一试,看看响应速度,不受影响即可。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /5 下一条

在线客服 快速回复 返回顶部 返回列表