制作一款支持摇晃检测的3D数字骰子转轮,专为4名玩家设计,适用于非洲棋盘游戏规则
Smart Dice 是一款基于 ESP32 构建的 3D 数字骰子摇器,其设计灵感源自非洲卢多(ludo)游戏规则,这种游戏深深根植于尼日利亚和西非文化之中。该骰子在 240x240 TFT 显示屏上呈现为一个真实可旋转的三维立方体。轻轻晃动设备即可触发掷骰,效果与真实骰子一致。本项目支持最多四名玩家,并采用经典规则:连续掷出三个6则会暂停一轮游戏。
这是我第一次在Hackster.io上发布作品,完全使用Arduino IDE编写,代码通过多个文件进行模块化拆分。
它是如何运作的
3D立方体渲染
立方体由三维空间中的8个顶点定义。每个帧中,顶点会先通过X、Y和Z旋转矩阵进行旋转,然后使用透视投影投射到二维屏幕上。通过画家算法将面按顺序从后往前排序,使近处的面始终覆盖远处的面。TFT_eSprite(离屏缓冲区)仅渲染立方体区域,同时保持周围所有UI文本不出现闪烁。
摇晃检测
MPU6050 在每次循环迭代中读取原始加速度传感器数据。通过三个轴的数值计算出总加速度大小,当其超过 SHAKE_THRESHOLD(默认为 25.0 m/s²)时,将触发滚转检测。为了提高随机性,随机数生成器的种子由 millis() 和实时加速度数据组合生成。
滚动结果与面部对齐
滚动动画完成后,stopRolling() 会逐渐减速立方体,并通过线性插值(lerp)将其角度调整至与结果匹配的面的已知朝向。这确保了动画结束时始终能清晰可见正确的面,不会出现部分或模糊的面。
布线
•ST7789 TFT 显示屏
•SCL(SCK)为 GPIO 18
•SDA(MOSI)为 GPIO 23
•RES(RST)为 GPIO 4
•DC 转 GPIO 2
•CS 为 GND(始终选中,单个显示)
•BLK 至 3.3V(背光始终开启)
所需库
通过Arduino IDE库管理器安装所有库:
•Bodmer 的 TFT_eSPI
•Adafruit MPU6050(或 ElectronicCats 用于克隆型号的 MPU6050)
•Adafruit 统一传感器
•SPI(内置)
•线缆(内置)
游戏规则
Smart Dice 实现了这些非洲骰子游戏规则:
•每位玩家摇动设备来掷骰子
•一次或两次掷骰可额外获得一次掷骰机会
•连续三次掷出6点,将导致一轮完整暂停
•转弯时悬架会自动升起
•六连击计数器在任何非6的点数时重置
主要挑战
最大的挑战是3D面的对齐问题。立方体会减速并停止,但可见的面很少与预期结果一致。三个独立的问题导致了这一情况:目标角度表未与面值映射对齐,每次掷骰时都会覆盖值映射,从而将结果强行固定在某个特定面上,以及对齐函数在未检查实际对应面的情况下,直接将角度四舍五入到最接近的90度。最终的解决方案是搜索面值数组以找到结果数值,确定其索引,并使用线性插值(lerp)将角度调整至该面预设的方向。
内存是另一个挑战。一个完整的240x240 16位精灵需要115KB的连续RAM。ESP32总RAM足够,但堆栈碎片化导致通常无法存在连续的内存块。解决方案是将精灵的颜色深度设置为8位,并仅将其尺寸调整为立方体区域,而不是整个屏幕。
本文编译自hackster.io





