You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)));

修改后效果验证

完成修改后,每次定时器触发时:

  1. 会真正修改容器内实体的y值
  2. 主动触发窗口重绘,渲染最新的实体位置
    此时你会看到矩形持续向下移动,控制台也会持续输出递增的y值。

内容的提问来源于stack exchange,提问作者tomasxboda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:30:55