我是C ++的新手,刚开始使用指针等等。我正在用SFML做一个简单的游戏。我制作了一个矢量“drawList”来存储将在屏幕上呈现的游戏中的所有形状。如果我在主循环开始之前将形状添加到向量中它工作正常,但是当我在运行时添加对象时,我在以下代码上遇到访问冲突错误:
for (size_t i = 0; i < drawList.size(); i++){
window.draw(*drawList[i]);
}
我认为* drawlist [i]是一个无效的指针,但到目前为止尝试解决这个问题的尝试都没有成功。 drawList向量和向其添加对象的方法在标题中设置如下:
extern std::vector<const sf::Drawable*> drawList;
struct Globals {
void AddDrawable(const sf::Drawable &drawable);
};
和相关的cpp中的这个一样:
std::vector<const sf::Drawable*> drawList;
void Globals::AddDrawable(const sf::Drawable & drawable){
drawList.push_back(&drawable);
}
然后我尝试通过调用“AddDrawable”方法并将以下方法作为参数提供给新实例化的抛射物类的构造函数中的向量:
sf::RectangleShape& GetShape() { return shape; };
我觉得事情的引用和指针确实存在明显的问题,但到目前为止我还没弄清楚。如果有人可以建议我解决这个问题的方法,那将会非常有用。提前谢谢!
编辑:
我将尝试给出一些有关Cris Luengo建议的更多背景信息,我有一个包含main while循环的main.cpp。在启动循环之前,我实例化Player
和Projectile
类。在while循环中,我检查是否有任何更新并在forloop中绘制,如下所示:
int main() {
Projectile bullet = Projectile(WINDOW_WIDTH /2.f, WINDOW_HEIGHT /2.f, 0.05f, 0.05f);
Player player = Player(WINDOW_WIDTH / 2.f, WINDOW_HEIGHT / 1.2f);
while (true) {
window.clear(Color::Black);
if (Keyboard::isKeyPressed(Keyboard::Key::Escape)) break;
for (size_t i = 0; i < updateList.size(); i++){
updateList[i]();
window.draw(*drawList.at(i));
}
window.display();
updateList
和drawList
都是从Player
和Projectile
类的构造函数中填充的向量(对于播放器和抛射物构造器分别):
Projectile::Projectile(float mX, float mY, float velX, float velY){
velocity = sf::Vector2f(velX, velY);
GetShape().setPosition(mX, mY);
//other shape stuff
Globals globals;
updateIndex = globals.AddToUpdateList([this]() {Update(); });
globals.AddDrawable(GetShape());
}
如前所示,GetShape()
方法设置在Player
和Projectile
标题中,如下所示:
sf::RectangleShape& GetShape() { return shape; };
就目前而言,当我在while循环开始之前实例化要添加到drawList
的对象时,此代码可以正常工作。如果我在运行时读取新数据,当它也被读取时,程序会在访问drawList
时在forloop中抛出访问冲突错误。
在运行时向drawList
添加内容时,我使用相同的代码。我只是在按下按钮时实例化一个新的Projectile
。想法是实例化类的构造函数将所需数据添加到列表中(updateList
工作正常)
提前谢谢