我的Rockclass
void rock::create(sf::Vector2f pos)
{
tex.loadFromFile("Images/meteorBig.png");
spr.setTexture(tex);
spr.setPosition(sf::Vector2f(pos.x, pos.y));
std::cout << pos.x << std::endl;
}
void rock::remove()
{
}
void rock::draw(sf::RenderWindow &window)
{
spr.move(0.0f, +.05f);
window.draw(spr);
}
我的主要课程
rock* rob = new rock();
rob->create(sf::Vector2f(300.0f + rand() % 50 + 10, 0.0f));
在渲染器中我有
rob->draw(mywindow);
在碰撞检查中我有
if (bo.sprite.getGlobalBounds().intersects(rob->spr.getGlobalBounds()))
{
cout << "Collides" << endl;
delete rob;
}
当我的子弹击中岩石时,它调试完全碰撞但当我使用delete rob;
以删除对象时它会崩溃
收到此消息
0x55111BBE(sfml-graphics-d-2.dll)中的未处理异常 SpaceDroid.exe:0xC0000005:访问冲突读取位置 0xFEEEFEF2。
答案 0 :(得分:0)
我的假设是你删除rob,你的指针,然后在下次再次尝试再次访问void指针。因此违反了访问权限。
关于解决方案,你可以检查rob是否等于nullptr(假设是c ++ 11),或者更好的是重新考虑你对原始指针的使用。
我不知道你的程序的上下文,如果rock是经常制作和删除的东西,考虑在一个持久的'纹理管理器'中保存一个岩石纹理对象,然后创建和删除你的岩石精灵/对象容器。也许有一个'rockList'或'entityList',它通过每一帧循环。然后删除变成一个微不足道的'.erase'