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
相关产品推荐
相关产品推荐

