如何删除sfml中的对象

时间:2015-04-12 06:59:37

标签: visual-c++ sfml

我的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。

1 个答案:

答案 0 :(得分:0)

我的假设是你删除rob,你的指针,然后在下次再次尝试再次访问void指针。因此违反了访问权限。

关于解决方案,你可以检查rob是否等于nullptr(假设是c ++ 11),或者更好的是重新考虑你对原始指针的使用。

我不知道你的程序的上下文,如果rock是经常制作和删除的东西,考虑在一个持久的'纹理管理器'中保存一个岩石纹理对象,然后创建和删除你的岩石精灵/对象容器。也许有一个'rockList'或'entityList',它通过每一帧循环。然后删除变成一个微不足道的'.erase'