基于MBED MCU的C++贪吃蛇游戏菜单类二维数组存储求助
嘿,作为刚接触C++和MBED的新手,你把菜单位图封装到Menu类里的思路真的很赞——这绝对是保持代码整洁的好开端!从你给出的头文件片段来看,我可以给你几个实用的优化方向,让这个类更高效、更易维护:
1. 位图存储的内存优化
MBED单片机的RAM资源通常很紧张,别直接用二维int数组存0和1,这太浪费空间了!你可以把每一行的二进制数据打包成单个字节(用uint8_t类型),这样能把存储空间压缩到原来的1/8。举个例子:
// 原来的二维int数组(占5*8*4=160字节) int icon_play[5][8] = { {0,1,1,1,1,1,1,0}, {0,1,0,0,0,0,1,0}, {0,1,1,1,1,1,1,0}, {0,1,0,0,0,0,1,0}, {0,1,1,1,1,1,1,0} }; // 优化后的uint8_t数组(仅占5*1=5字节) const uint8_t icon_play[] = { 0b01111110, 0b01000010, 0b01111110, 0b01000010, 0b01111110 };
别忘了给这些位图加上const修饰,编译器会自动把它们放到Flash而非RAM中,进一步节省宝贵的运行内存。
2. Menu类的封装与接口设计
- 把位图绘制逻辑封装到
Menu类的成员函数里,比如写一个draw_icon函数,避免在主函数里重复写绘制代码:void Menu::draw_icon(N5110 &lcd, int x, int y, const uint8_t *icon, int height) { for (int row = 0; row < height; row++) { // 调用N5110的Sprite绘制接口 lcd.drawSprite(x, y + row, 8, &icon[row]); } } - 如果你的图标有不同宽度,也可以把宽度作为参数传入,让函数更通用。
- 把位图的定义放到
Menu类的private区域,只暴露绘制、获取图标等公共接口,严格遵循封装原则。
3. 头文件的规范优化
- 你已经用了
#ifndef头文件保护,这很好!也可以换成更简洁的#pragma once(MBED的编译器完全支持),减少冗余代码。 - 如果图标数量较多,建议把所有位图定义单独放到一个
menu_icons.h文件中,再在Menu.h里引用,避免Menu类的头文件因为大量位图定义变得臃肿。
4. 可读性提升小技巧
可以用枚举类型来标识不同的图标,这样调用时更直观,不容易出错:
enum class MenuIcon { Play, Settings, Exit, // 其他图标... }; // 在Menu类中添加获取图标的函数 const uint8_t* Menu::get_icon(MenuIcon icon_type) { switch(icon_type) { case MenuIcon::Play: return icon_play; case MenuIcon::Settings: return icon_settings; case MenuIcon::Exit: return icon_exit; default: return nullptr; } }
要是你有具体的问题(比如位图绘制异常、内存不足报错等),可以补充细节再提问哦!
内容的提问来源于stack exchange,提问作者Andrea Loriedo
相关产品推荐
相关产品推荐

