Bonjour tout le monde,
J'ai une scène avec différents items. J'aimerais gérer les collisions et limiter les mouvements des différents items à l'intérieur de ma scène (les bords de sceneRect).
Pour le moment, j'ai créé 4 lignes correspondant aux différents bords de ma scène:
J'ajoute ensuite un autre item personnalisé dans la scène. J'ai redéfini les méthodes boundingRect et paint et gère la collision dans cette dernière:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 GraphicsScene * scene = new QGraphicsScene(this); scene->setSceneRect(0,0, 300, 200); QLineF lineTop(scene->sceneRect().topLeft(), scene->sceneRect().topRight()); QLineF lineBottom(scene->sceneRect().bottomLeft(), scene->sceneRect().bottomRight()); QLineF lineLeft(scene->sceneRect().topLeft(), scene->sceneRect().bottomLeft()); QLineF lineRight(scene->sceneRect().topRight(), scene->sceneRect().bottomRight()); QPen pen(Qt::red); scene->addLine(lineTop, pen); scene->addLine(lineBottom, pen); scene->addLine(lineLeft, pen); scene->addLine(lineRight, pen);
Ce que je voudrais faire dans un premier temps, c'est de déplacer l'item en mouvement vers la gauche, la droite, le bas ou le haut d'un pixel seulement en fonction de la ligne qui est touchée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 QRectF Item::boundingRect() const { return QRectF(0,0, m_width, m_height); } void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); painter->setBrush(Qt::yellow); if (scene()->collidingItems(this).size() > 0) { DoCollision(); } painter->drawRect(boundingRect()); } void Item::DoCollision() { //Ce code ne marche pas... mais je m'y attendais QPointF newPos = mapToParent(-boundingRect().width(), -boundingRect().width()); if (!scene()->sceneRect().contains(newPos)) { newPos = mapToParent(0,0); } setPos(newPos); }
Secondement, si l'objet touché est de type item (en gros un second item) alors, je voudrais déplacer en même temps l'autre objet.
J'ai bien une idée pour faire ces deux étapes mais je ne sais pas si c'est optimal:
- Faire une classe contenant un type énuméré avec une méthode virtuelle pour tester le type.
- Faire hérité cette classe par tous mes QGraphicsItem
- Au niveau de paint(), récupérer tous les items qui sont en collision avec l'item courant et appliquer un déplacement en fonction du type d'objet.
J'ai l'impression de me compliquer la vie mais je ne vois pas comment faire autrement...
Si vous avez des idées, n'hésitez pas!
Merci
Partager