Моя проблема заключается в следующем:
Я разрабатываю маленькую игру; Однако я столкнулся с очень большой проблемой, которую я пытался решить в течение некоторого времени. По сути, я хочу обновить здания, если использование имеет достаточно очков, но данные в Building
объекты повреждены. Единственный объект, который «должен» быть, это первый выделенный объект в buildings
vector
,
Класс здания:
Когда я запускаю программу, я сталкиваюсь с черным экраном (это означает, что он начал правильно); и когда я отлаживаю, я получаю ошибку, такую как: Access violation reading location 0x00000008
, Значение NULL
значение было использовано.
class Building {
public:
int x = 0, y = 0;
vector<int> buildingID;
vector<int> upgradeCost;
int size = 4;
Building(vector<int> buildingID, int x, int y, vector<int> upgradeCost)
: buildingID(buildingID), x(x), y(y), upgradeCost(upgradeCost) { }
virtual void upgrade();
void drawTile(SDL_Rect, SDL_Surface*);
int buildingLevel = 1;
protected:
};
void Building::upgrade() {
if((buildingLevel+1) <= size)buildingLevel += 1;
}
void Building::drawTile(SDL_Rect drawRect, SDL_Surface* drawnTo) {
Tile::Tiles.at(buildingID[buildingLevel - 1]).drawTile(drawRect, drawnTo);
}
Функция, которая генерирует здания:
void Level::generateTerrain() {
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++) {
int tile = rand()%100;
if (tile >= 25 && tile <= 28) this->tiles.at(i + (j*this->width)) = 2;
else if (tile < 24) this->tiles.at(i + (j*this->width)) = 1;
else if (tile == 29) {
this->addBuilding(Building(vector<int>{4, 3, 2, 1}, i * 75, j * 75, vector<int>{1, 1, 1, 1}), i, j);
}
else this->tiles.at(i + (j*this->width)) = 0;
}
}
Функция, которая добавляет здания:
void Level::addBuilding(Building building, int x, int y) {
buildings.push_back(building);
tiles.at(x + (y*this->width)) = buildID(building.buildingID[building.buildingLevel-1], &buildings.at(buildings.size()-1));
}
И, наконец, функция, которая рисует плитки / здания:
void Level::drawLevel(int x, int y, int width, int height, SDL_Surface* drawnTo, int beginningX, int beginningY) {
SDL_Rect tempRect;
tempRect.w = 75;
tempRect.h = 75;
for (int i = x; i <= (x + width); i++)
for (int j = y; j <= (y + height); j++) {
if (tiles.at(i + (j*this->width)).id == 999999) continue;
tempRect.x = (i*Tile::Tiles.at(tiles.at(i + (j*this->width)).id).tileSurface->w) + beginningX;
tempRect.y = (j*Tile::Tiles.at(tiles.at(i + (j*this->width)).id).tileSurface->h) + beginningY;
Tile::Tiles.at(tiles.at(i + (j*this->width)).id).drawTile(tempRect, drawnTo);
}
}
Если вам нужно больше кусков кода, пожалуйста, просто спросите.
Спасибо за любую помощь.
Единственная часть вашего кода, которая мне кажется подозрительной, это то, как в addBuilding () вы используете адрес элемента вектора во втором параметре для buildID (). Класс Vector перераспределяет память, которую он использует, когда ему необходимо увеличить емкость, поэтому существующие элементы, вероятно, больше не будут находиться по тому же адресу, на который указывают ваши указатели, когда это произойдет.