【发布时间】:2018-07-14 14:29:12
【问题描述】:
这是我在这个网站上的第一个问题。我学了一年编程,总能在项目中找到问题的答案。我知道这是一个非常简单的问题,这里有一个代码:
#include "stdafx.h"
#include "Wave.h"
Wave::~Wave()
{
}
void Wave::setEnemyCount(int count) {
nemyCount = count;
}
bool Wave::createWave() {
for (int i = 0; i < enemyCount; i++) {
enemyArray.push_back(Enemy());
}
for (int i = 0; i < enemyArray.size(); i++) {
int randomPositionX = rand() % 150 + 10;
int randomPositionY = rand() % 50 + 10;
if (!enemyArray.at(i).init(randomPositionX, randomPositionY)) {
std::cout << "Create wave(init enemies) - failed\n";
return false;
}
}
return true;
}
void Wave::drawWave(Window* window) {
window->setCursor({ 0, 2 });
window->setColor(Window::Color::RED);
std::cout << "Enemies: " << enemyArray.size();
window->setColor(Window::Color::WHITE);
for (int i = 0; i < enemyArray.size(); i++) {
enemyArray.at(i).draw(window);
//std::cout << i;
}
}
void Wave::update(Bullet* bullet, Player* player) {
for (int i = 0; i < enemyArray.size(); i++) {
if (player->checkShoot()) {
if ((bullet->getPositionX() >= enemyArray.at(i).getPositionX() && bullet->getPositionX() <= enemyArray.at(i).getPositionX() + 5)) {
if ((bullet->getPositionY() >= enemyArray.at(i).getPositionY() && bullet->getPositionY() <= enemyArray.at(i).getPositionY() + 5)) {
player->addScore(10);
enemyArray.erase(enemyArray.begin() + i);
}
}
}
}
if (enemyArray.size() <= 0) {
std::cout << "WAVE COMPLETE";
Sleep(2000);
enemyCount += 5;
createWave();
}
}
int Wave::getEnemyCount() const {
return enemyCount;
}
碰撞工作正确,但是当子弹碰到索引的敌人时,例如:5,代码总是删除最后一个索引的敌人,所以我可以删除每个敌人只射击索引为 5 或 1 或 7 的敌人。
【问题讨论】:
-
向量的大小不能小于零。实际上
size返回的大小是unsigned,所以不能小于零。因此使用小于的比较是错误的。 -
只要子弹没有碰到两个具有连续索引的敌人,代码看起来是正确的。请显示minimal reproducible example,包括示例输入/输出。
-
至于您的问题,请考虑擦除元素时的向量索引。向量中 next 元素的新索引是多少?您删除的元素之后的元素?试着在一张方格纸上画出向量,每个方格都是一个元素。然后“擦除”一个元素并将剩余的元素移动以填充被擦除元素的洞。
-
我知道,但这并不重要。我在循环中有问题。这就是所有方法,我认为更好的方法是粘贴所有代码:)。
-
minimal reproducible example 请。所有代码都不是最少的。