How can I detect collision among QPixmaps and QGraphicsItems objects
-
I thought the @QVector<QGraphicsPixmapItem*> targetItems;
foreach(QPixmap pix, main_targets) {
QGraphicsPixmapItem* item = QGraphicsPixmapItem(pix);
targetItems.append(item);
}@ takes each instance of the main_targets array, and creates QGraphicsPixmapItems of them. -
I pass the pmap to the MainTarget class by pointer, which was previously by reference. There isn't a specific line that the compiler is showing. It crashes on execution. I replaced main_targets[index] with targetItems since that should hold the QGraphicsPixmapItem items.
@void Dialog::setPixmaps()
{
//Targets are delivered every 1sec
Five_timer->start(1000);QList<QGraphicsPixmapItem*> targetItems; foreach(QPixmap pix, main_targets) { QGraphicsPixmapItem* p_item = new QGraphicsPixmapItem(pix); targetItems.append(p_item); } int StartY = 0; //Random starting Y point between -140 and -389 StartY = (qrand() % (-400 + 150) -140); index = (qrand() % 9); { if(index % 2 == 0) { //When even is selected start at far right pmap = new MainTargets(targetItems[index], 0); pmap->setPos(345,StartY); } else { //When odd is selected start at far left pmap = new MainTargets(targetItems[index], 1); pmap->setPos(-325,StartY); } } scene->addItem(pmap);}@
-
Guess that is where the problem is I thought the @ QList<QGraphicsPixmapItem*> targetItems;
foreach(QPixmap pix, main_targets) {
QGraphicsPixmapItem* p_item = new QGraphicsPixmapItem(pix);
targetItems.append(p_item);@ fills the main_target list. If not what is the purpose of this line? -
@ main_targets[0] = QPixmap(":images/darkbluelogo.jpg");
main_targets[1] = QPixmap(":images/graylogo.jpg");
main_targets[2] = QPixmap(":images/lightbluelogo.jpg");
main_targets[3] = QPixmap(":images/lime.jpg");
main_targets[4] = QPixmap(":images/pink.jpg");
main_targets[5] = QPixmap(":images/purple.jpg");
main_targets[6] = QPixmap(":images/redlogo.jpg");
main_targets[7] = QPixmap(":images/yellow.jpg");
main_targets[8] = QPixmap(":images/brown.jpg");@The main_targets are created and stored in the constructor initially before anything is done. So the qlist should have 9 qpixmaps.
-
If I'm not mistaken you need to use .append() method to add elements to the QList. QList::opeartor[] does not work for adding new elements.
EDIT: Yep, you have to use append() or operator+=() to extend a list "operator[]":http://qt-project.org/doc/qt-5/qlist.html#operator-5b-5d requires an index to be valid (0 <= i < qlist.size())
-
I wouldn't delete the items right away, but only hide them, and delete them later on. But otherwise, it might be something like this.
Have you taken a look at the Colliding Mice example?
-
So you have some QGraphicsItem subclass and come QGraphicsPixmap. You check whether they collide. That part you should be able to take from the example.
If they collide, you hide those items and add them to a list of items "to be deleted" (or "to be re-used", if you prefer).
You either clean up the list from time to time (using e.g. a timer), or you re-use the items in the list if you need to add a new item (which would be a performance optimization, since creating GraphicsItems isn't free).
Where specifically do you have problems?
-
If you only want to compare two items, you can use their shape() and QPainterPath::intersects
-
Is there any way to remove and delete the pellet target from within the QGraphicsRectItem. I'm just hiding the two when they collide, but that doesn't remove it and since the class inherits from the QGraphicsItem base class there isn't a removeitem() function.
@class GraphicsCircle : public QGraphicsRectItem
// class for the fire bullets
{public:
GraphicsCircle(qreal dirx, qreal diry)
: m_Speed(5)
, m_DirX(dirx)
, m_DirY(diry)
{
setRect(-3.0,-3.0,8.0,8.0);
setPos(-140, 235);
QRadialGradient rGrad( 0.0, 0.0, 20.0, 0.0, 0.0);
rGrad.setColorAt(0.0, QColor(255,255,255));
rGrad.setColorAt(0.7, QColor(255,255,225));
rGrad.setColorAt(1.0, QColor(255,0,0,0));
setBrush(QBrush(rGrad) );
setPen(QPen(Qt::NoPen));w = 7; h = 7; } QRectF boundingRect() const { qreal shift = 1; return QRectF(-w/2 -shift, - h/2 - shift, w + shift, h + shift); } QPainterPath shape() const { QPainterPath path; path.addRect(boundingRect()); return path; } virtual ~GraphicsCircle() {} void advance(int phase) { if(phase == 0) return; setPos(x()+m_Speed*m_DirX, y()+m_Speed*m_DirY); foreach( QGraphicsItem * item, this->collidingItems()) { item->hide(); this->hide(); } }@