游戏开发多子弹生成实现指导请求——两年前面试未解决问题
多子弹生成实现方案
1. 修改成员变量
把Game类里的单个子弹指针替换成动态容器,用来存储多颗子弹:
#include <vector> // Game类的成员变量 std::vector<Bullet*> bullets_;
2. 重写SpawnBullet函数
不再删除旧子弹,直接创建新子弹并添加到容器中:
void Game::SpawnBullet(XMVECTOR position, XMVECTOR direction) { Bullet* newBullet = new Bullet(position, direction); newBullet->EnableCollisions(collision_, 3.0f); bullets_.push_back(newBullet); }
3. 更新所有子弹的逻辑
遍历容器中的每一颗子弹,逐一执行更新和边界处理:
void Game::UpdateBullet(System* system) { // 遍历更新每颗子弹 for (auto bullet : bullets_) { if (bullet != nullptr) { bullet->Update(system); WrapEntity(bullet); } } // 清理失效子弹(比如超出边界、命中目标),反向遍历避免迭代器失效 for (auto it = bullets_.end(); it != bullets_.begin(); ) { --it; Bullet* bullet = *it; if (bullet != nullptr && bullet->IsOutOfBounds()) // 假设Bullet有判断失效的方法 { delete bullet; bullets_.erase(it); } } }
4. 玩家输入逻辑保持不变
原有的空格发射逻辑无需修改,现在每次按空格都会新增一颗子弹,而非替换旧子弹:
void Game::UpdatePlayer(System* system) { if (keyboard->IsKeyPressed(VK_SPACE)) { XMVECTOR playerForward = player_->GetForwardVector(); XMVECTOR bulletPosition = player_->GetPosition() + playerForward * 10.0f; SpawnBullet(bulletPosition, playerForward); } }
5. 补充内存清理
在Game类的析构函数中释放所有子弹内存,避免泄漏:
Game::~Game() { for (auto bullet : bullets_) { delete bullet; } bullets_.clear(); }
进阶优化:如果用C++11及以上版本,推荐用
std::unique_ptr代替裸指针,自动管理内存,省去手动delete的步骤:std::vector<std::unique_ptr<Bullet>> bullets_; // Spawn时直接构造: bullets_.emplace_back(std::make_unique<Bullet>(position, direction));
内容的提问来源于stack exchange,提问作者GloriousDemonFist
相关产品推荐
相关产品推荐

