wxWidgets游戏循环中类变量仅更新一次的问题求助
问题原因及修复方案
核心问题1:循环操作的是实体副本而非原对象
你的Update和Render方法中,使用值拷贝遍历entities容器:
for (Entity entity : entities) { entity.Update(); // 修改的是临时副本的y值,容器内原对象无变化 }
每次循环都会创建Entity的临时副本,调用Update仅修改副本的y值,容器里的原实体完全没被改动。
修复:改为引用遍历,直接操作容器内的原对象:
// 修改Update方法 void Window::Update(wxCommandEvent & event) { for (Entity& entity : entities) { // 添加&转为引用 entity.Update(); } } // 修改Render方法 void Window::Render(wxPaintEvent & event) { wxPaintDC dc(this); for (Entity& entity : entities) { // 同样改为引用 entity.Render(dc); } }
核心问题2:更新后未触发窗口重绘
wxWidgets不会自动检测实体属性变化并重绘窗口,你在OnTimer里调用Update修改实体后,需要主动触发重绘事件,否则窗口不会刷新显示最新的实体位置。
修复:在OnTimer方法末尾添加窗口重绘调用:
void Window::OnTimer(wxCommandEvent & event) { Update(event); Refresh(); // 触发重绘事件,调用OnPaint Update(); // 立即处理重绘请求,确保画面及时更新 }
额外优化:AddEntity的参数传递
当前AddEntity接收Entity&,虽然逻辑可行,但可以改为传值并利用移动语义减少拷贝:
// 修改AddEntity方法 void Window::AddEntity(Entity entity) { entities.push_back(std::move(entity)); } // Window构造中的调用可简化为直接传递临时对象 AddEntity(Entity((width / 2) - 50, 100, 100, 100, wxColour(255, 0, 0)));
修改后效果验证
完成修改后,每次定时器触发时:
- 会真正修改容器内实体的
y值 - 主动触发窗口重绘,渲染最新的实体位置
此时你会看到矩形持续向下移动,控制台也会持续输出递增的y值。
内容的提问来源于stack exchange,提问作者tomasxboda
相关产品推荐
相关产品推荐

