STM32自制GUI小游戏--Apple的学习笔记
一,前言
要过年了,我就玩会吧~GUI之前学习过了guilite源码,那么我就调用它的API自己做个小游戏玩玩。步骤是先在vs上完成调试,然后移植到stm32F4开发板上。主要也想多用用新买的并口LCD屏,因为之前的ili9325并口8bit连camera不能用DMA,我又买了个ili9431并口16bit屏幕(连接camera方便DMA直接采集赋值),因为8bit的话,16bit需要先传高bit再传低bit给LCD。而camera DMA是4个字节按低地址到高地址写到LCD,这样就导致8bit LCD无法通过DMA连接camera了。跑题了,我顺便述说我的新屏幕,哈哈~先看下游戏效果图吧!其实可以理解为一个超级玛丽小游戏。
image.png
二,vs调试遇到的问题
我是官网的example基础上,借用它图及走路,跳跃的逻辑代码,然后改成了按键可以触发的小游戏。想想容易,结果过程中也遇到了些坎坷。
1. 文字更新,无法消去之前的。--已解决
rect在surface创建的时候范围需要填写正确。然后通过调用s_surface->show_layer
来显示level0层的内容,进行恢复。
2. 如何设计重玩。--已解决
做了些标志位,然后重玩需要调用reset函数来重置位置。
3. 背景图片移动不知道用哪个API或设计方案。--未解决
现在也没找到解决方法,guilite库好像不支持图片移动的API。它的移动物体要么是重绘,要么就是要预先准备好一张张图片。这个我去之后有机会再看看其它GUI源码是如何做的。否则三维立方体确实是有移动的,但是这个移动只是几条线段的移动。我这个背景图片数组很大,难道也要通过矩阵变换数学公式来实现移动?
三,STM32GUI调试问题
1. cpp函数中按钮按下后的回调函数总是找不到。导致编译不通过。
原因是UIcode.cpp是cpp文件不是c文件,所以c要引用c++的函数需要添加extern c。主要是忘记了它是cpp文件,哈哈~
2. 代码一运行就进入了while循环。
因为有2层,在底层set_surface的时候到calloc出现assert error进入while死循环。查了下我设置了2403202=150K,而STM32F407虽然有192Kram,但是其中64K不是连续的。于是我缩小了尺寸,挑选要更新的界面区域。大概为48K吧,但是依然calloc出错?
于是思考了下calloc申请堆空间出错只有一种原因,就是内存不过,但是现在48K为什么会不够呢!想起来HEAP段的大小可以设置的,估计设置小了,查了map文件果然,HEAP默认只分配了512字节。
HEAP 0x20001b58 Section 512 startup_stm32f40_41xxx.o(HEAP)
Heap_Mem 0x20001b58 Data 512 startup_stm32f40_41xxx.o(HEAP)
STACK 0x20001d58 Section 1024 startup_stm32f40_41xxx.o(STACK)
Stack_Mem 0x20001d58 Data 1024 startup_stm32f40_41xxx.o(STACK)
原因找到了,那么就修改Heap段配置大小,修改startup_stm32f40_41xxx.s
Heap_Size EQU 0x00000200
改成Heap_Size EQU 0x00010000
3. object走路速度快。
也就是刷屏变换比vs2017工程中快,所以把delay50变100。这样调试下速度差不多。
4. 跳一下后,key数值每次加2
防抖动从5改成10.估计我一次按下抖动了2次,所以认为按下2次。修改为10后,按一次key,跳一次数值加1。一切如预期。
四,总结
Every thing under control. What a wonderful day!
游戏使用方法
- 开机
- 按一下key0,游戏开始,主人公出现。
- 在游戏过程中按key0,主人公跳起,必要碰到4个障碍物。
- 跳过4个障碍物后,显示win结束游戏,按一次key0又可以重来。
- 过程中若遇到障碍物,则显示GO。游戏结束,按一次key0又可以重来。
游戏录制效果
需要源码可以联系我~