Sunday 15 March 2015

c++ - QGraphicsScene::removeItem: item scene is different from this scene -



c++ - QGraphicsScene::removeItem: item scene is different from this scene -

there weird qgraphicsscene::removeitem, when remove 2 items scene next message:

qgraphicsscene::removeitem: item 0x5edb28's scene (0x0) different scene (0x5e7790) qgraphicsscene::removeitem: item 0x5edc18's scene (0x0) different scene (0x5e7790)

even though 2 items in scene.

i've checked items scene against scene returns true:

if(player->scene() == m_scene){ m_scene->addtext("same"); // text added }else{ m_scene->addtext("different"); }

m_scene come class:

class game : public qgraphicsview { q_object public: game(); public slots: void fixedupdate(); signals: private: qrectf *scenesize; qgraphicsscene *m_scene; qgraphicsrectitem *m_rect; qtimer *m_timer; character *player; character *enemy; };

and class character class inheriting qgraphicspolygonitem:

class character : public qobject, public qgraphicspolygonitem { q_object public: character(qreal x, qreal y, qreal w, qreal h, qstring tag, qgraphicsscene *scene = 0, qgraphicsitem *parent = 0); character(qrectf rectf, qstring tag, qgraphicsscene *scene = 0, qgraphicsitem *parent = 0); character(qstring tag, qgraphicsscene *scene = 0, qgraphicsitem *parent = 0); void setvalue(qreal x, qreal y, qreal w, qreal h); void setvelocity(qreal vx, qreal vy); void setvelocityx(qreal vx); void setvelocityy(qreal vy); void settag(qstring tag); qreal vx() const; qreal vy() const; qreal w() const; qreal h() const; qstring tag() const; qgraphicsscene *currentscene() const; void fixedupdate(); void removecharacter(); signals: public slots: private: qreal m_x; qreal m_y; qreal m_w; qreal m_h; qreal m_vx; qreal m_vy; qstring m_tag; qgraphicsscene *m_scene; };

and phone call removeitem

void game::fixedupdate(){ if(player->collideswithitem(enemy)){ player->setvelocityx(0); enemy->setvelocityx(0); //removecharacter phone call scene()->removeitem(this); player->removecharacter(); enemy->removecharacter(); }else{ player->fixedupdate(); enemy->fixedupdate(); } }

can explain me why these messages, please?

edit:

game::game(){ scenesize = new qrectf(0, 0, 640, 480); m_scene = new qgraphicsscene(*scenesize, this); setscene(m_scene); player = new character(qrectf(0, 0, 50, 50), "player", m_scene); player->setvelocityx(1.5); //m_scene->additem(player); enemy = new character(qrectf(500, 0, 20, 20), "enemy", m_scene); enemy->setvelocityx(-0.5); //m_scene->additem(enemy); //m_scene->addtext(qstring::number(player->x() + player->vx())); if(player->scene() == m_scene){ m_scene->addtext("same"); }else{ m_scene->addtext("different"); } m_timer = new qtimer(this); connect(m_timer, signal(timeout()), this, slot(fixedupdate())); m_timer->start(1000 / 60); }

finally i've found it.

it in game::fixedupdate() function, player->collideswithitem(enemy) still true after pointers removed scene. i've set check before checks collision, so:

void game::fixedupdate(){ if(player->scene() != null && enemy->scene() != null){ if(player->collideswithitem(enemy)){ player->setvelocityx(0); enemy->setvelocityx(0); //removecharacter phone call scene()->removeitem(this); player->removecharacter(); enemy->removecharacter(); }else{ player->fixedupdate(); enemy->fixedupdate(); } } }

which not give messages after removal.

c++ qt qgraphicsview qgraphicsscene

No comments:

Post a Comment