C++ SFML中Cell状态修改无效:点击单元格无法变黄
问题分析与解决方案
核心问题:值传递导致修改无效
你的Map::getCellAt方法返回的是Cell对象的值拷贝,而非原对象的引用或指针。这意味着调用map.getCellAt(cellCoord).setCellState(...)时,你修改的是临时生成的Cell副本,Map数组中存储的原Cell对象的m_state根本不会发生变化。
修复步骤
1. 修改getCellAt返回引用
在Map.hpp中,将getCellAt的返回类型改为引用,让操作直接作用于原对象:
Cell& getCellAt(int x, int y) { return m_map[x][y]; }
如果需要只读访问,可以额外添加const版本:
const Cell& getCellAt(int x, int y) const { return m_map[x][y]; }
2. 为Cell添加getCellState方法
drawMap函数中调用了cell.getCellState(),但Cell类未实现该方法,需在Cell.hpp的public区域补充:
CellState getCellState() const { return m_state; }
3. 修复drawMap中的未定义变量
mapManager.cpp的drawMap里使用的sizeY和sizeX未定义,替换为Map类的静态成员:
for (size_t y = 0; y < Map::m_sizeY; y++) { for (size_t x = 0; x < Map::m_sizeX; x++) { // ...原有绘制逻辑 } }
4. 初始化Cell的显示大小
Cell继承自sf::RectangleShape,但构造函数未设置大小,会导致单元格无法正常显示。在Cell的构造函数中添加大小设置:
Cell(const CellState& state) : m_state(state) { setSize(sf::Vector2f(64.f, 64.f)); // 与Map的m_cellSize对应 } Cell() { m_state = CellState::notSelected; setSize(sf::Vector2f(64.f, 64.f)); }
5. 修复selectCell的参数传递问题
getCellAt需要两个int参数,但你传入了sf::Vector2i,需调整为:
void MapManager::selectCell(sf::Vector2i cellCoord) { map.getCellAt(cellCoord.x, cellCoord.y).setCellState(CellState::selected); m_lastSelectedCell = cellCoord; }
同理修改deselectCell:
void MapManager::deselectCell(sf::Vector2i cellCoord) { map.getCellAt(cellCoord.x, cellCoord.y).setCellState(CellState::notSelected); }
修复后流程验证
- 点击单元格时,
selectCell通过引用获取Map中的原Cell对象 - 调用
setCellState直接修改原对象的m_state为selected drawMap时通过引用读取原Cell的状态,设置对应的黄色并绘制
内容的提问来源于stack exchange,提问作者Otto von Bismarck
相关产品推荐
相关产品推荐

