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

C++ raylib游戏中Projectile(炸弹)位置每次Update被重置的问题

问题原因

你的炸弹位置看似被重置,本质是遍历炸弹时使用了值传递而非引用传递:

  • 在Game::Update和Game::Draw中,你用了for (Bomb bomb : bombs),这会为每个炸弹创建一个副本
  • 调用bomb.Update()时,修改的是副本的位置,原队列bombs里的炸弹对象完全没被改动
  • 下一次循环又会重新创建新的副本,读取原对象的初始位置,所以看起来像是每次都被重置
修复方案

将遍历改为引用传递,直接操作原队列中的对象:

修改Game::Update中的遍历

void Update() {
    if (bombs.size() > 0)
        cout << bombs[0].position.y << endl;
    Shoot();
    cannon.Update();
    // 改为引用&,直接修改原对象
    for (Bomb& bomb : bombs)
        bomb.Update();
    if (bombs.size() > 0)
        cout << bombs[0].position.y << endl;
}

修改Game::Draw中的遍历(可选但推荐)

Draw操作不需要修改对象,用const引用避免不必要的拷贝:

void Draw() {
    cannon.Draw();
    // 用const引用,更高效
    for (const Bomb& bomb : bombs) {
        bomb.Draw();
    }
}
额外优化建议

你的炸弹移动速度是固定的200,但不同帧率下实际移动速度会不一致(比如FPS=30时每秒只移动30次,总距离会减半),建议乘以帧时间来保证速度统一:

void Move() {
    // 乘以GetFrameTime(),确保每秒移动speed像素
    position.y -= speed * GetFrameTime();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:45:09