Seite 1 von 1

QCanvas Kollisionserkennung

Verfasst: 28. Oktober 2004 17:14
von Carsten
Hiho

Ich habe ziemliche Probleme mit QCanvas :/.

Also ich bin anhand http://www.digitalfanatics.org/projects ... ter12.html disem Tutorial auf den Geschmack auf Canvas Objekte gekommen.

Mein Prolem ist leider folgendes: Ich versuche eine Kollisionserkennung für dieses Beispiel zu schreiben. Das bedeutet wenn ich ein Canvas Objekt auf ein Anderes "lege" soll es automatisch auf einen freien bereich verschoben werden.

Wenn ich das richtig verstanden habe muß ich doch eigentlich (bezogen auf das Beipiel)
QCanvasItemList il = c->collisions( myCanvas.boundingRect() );
for( QCanvasItemList::Iterator it=il.begin(); it!=il.end(); ++it )
{
if( (*it)->rtti() != 4 ){ // 4 ist ja für Polygon
myCanvas.moveBy(100,0);
Doch leider klappt das absolut nicht. Ich habe auch schon diverse andere Sahcen ausprobiert und bin so langsam mit meinem Latein am ende :/

Wenn einer ein anderes Beispiel oder ein Vorschlag hat...

Danke schon mal
Carsten

Verfasst: 29. Oktober 2004 08:48
von Carsten
Damit funktioniert das nun soweit das immer wenn ein neues QCanvasPolygon erstellt wird dieses auf Kollision ermittelt wird. Sollte eine Kollision festgestellt werden, wird das Polygon um die Breite des umschließenden bounding Rect verschoben. Komischerweise wird das zweite Polygon gleich 2 mal verschoben ..?? Aber nur das zweite... verwirrend :shock:

Code: Alles auswählen

void MyCanvasViewWindow::neuesCanvas()
{
	QPointArray points( 4 );
	points.setPoint( 0, 0, 0 );
	points.setPoint( 1, 0, 40 );
	points.setPoint( 2, 40, 40 );
	points.setPoint( 3, 40, 0 );

	QCanvasPolygon *poly = new QCanvasPolygon( c );
	poly->setPoints( points );
	poly->setX( 0 );
	poly->setY( 0 );
	poly->setBrush( Qt::blue );
	poly->show();
	
	// check for collision
	emit collision(poly);
}

void MyCanvasViewWindow::collisionMove(QCanvasPolygon *poly)
{
	bool crash= false;
	QCanvasItemList list= c->allItems();
	for( QCanvasItemList::Iterator it=list.begin(); it!=list.end(); ++it )
	{
		myCanvasItem= (*it);
		QRect bounding= myCanvasItem->boundingRect();
		int w= bounding.width();
		if (list.count()>1) {
			poly->moveBy((w)+10, 0);
			crash= true;}	
		qWarning("collision2");		
	}
	c->update();
}

Verfasst: 29. Oktober 2004 09:10
von Carsten
omg
Das kommt davon wenn man rumtestet und nicht alten coder wieder löscht

Code: Alles auswählen

if (list.count()>1) {