如何在QGraphicsScene离开场景窗口时从QGraphicsSce中删除它

时间:2015-08-30 14:57:45

标签: c++ qt qgraphicsview qgraphicsitem qgraphicsscene

所以我有一个名为bullet的项目,我希望它在离开QGraphicsScene窗口时清除

我的代码是:

if(bullet->scene() != NULL)
    {
        if(bullet->x() >= 800 || bullet->y() >= 600)
        {
            scene->removeItem(bullet);
            scene->update();
            view->update();
            qDebug("Bullet went out of screen so it has been removed");
        }
    }

这样可行,但我遇到的问题是在完成此操作后,它不会让我创建另一个项目符号。

先谢谢您的帮助

1 个答案:

答案 0 :(得分:1)

我认为你的子弹是动画的(因为子弹通常会让你知道)所以它必须实现advance()方法。

你可以在那里检查边界:

// in Bullet::advance() after you advance the bullet position
// if the scene rect doesn't contain the item rect remove from scene
if (!scene()->sceneRect()->contains(boundingRect())) scene()->removeItem(this);

您当前的解决方案假定子弹只会增加其在X和Y中的位置,并且场景将始终为800x600,这是糟糕的设计。您可以放大窗口,这会立即打破您的逻辑。您可以从右向左射击,这意味着如果从左侧离开它,您的子弹将永远不会从场景中移除。无论场景有多大以及子弹的方向是什么,上述解决方案都能正常工作。

  

我遇到的问题是在完成之后它不会让我   创建另一个项目符号

根据您发布的代码,我们不清楚问题的原因是什么。您应该能够根据需要向场景添加尽可能多的项目,或者您的系统可以处理。听起来好像你是通过指针来手动管理子弹,如果场景中只有一颗子弹,这似乎是一个好主意,但在实际情况下,场景将是完全动态的,你可能有数百个子弹,所以你不能用这种方式跟踪它们。

这就是为什么你必须使你的物品"智能"并在其中实现其管理逻辑,因此您只能跟踪主要项目,例如您的播放器项目。其他一切都应该通过场景和项目之间的互动来互动。例如,当你的玩家项目射击子弹时,你不应该手动创建它,它应该在你的玩家项目中实现。因此,当您致电player->shoot()时,它会scene()->addItem(new Bullet(bulletSpeed, bulletDirection)或类似的东西。在相同的逻辑流程中,如果子弹离开现场,子弹将自动被移除,或者它击中敌人,并且还对该敌人造成伤害,如果致命的话,也将从场景中移除敌人。

请记住,从场景中删除项目时,项目不会被删除,所有权责任将转移给您。如果你想从内存中删除它,你从场景中删除它后,你可以调用delete this;,如果它是该项目的最后一次操作就应该没问题。