QCanvas Kollisionserkennung

Alles rund um die Programmierung mit Qt
Antworten
Carsten
Beiträge: 11
Registriert: 20. Oktober 2004 14:49

QCanvas Kollisionserkennung

Beitrag 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
Carsten
Beiträge: 11
Registriert: 20. Oktober 2004 14:49

Beitrag 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();
}
Carsten
Beiträge: 11
Registriert: 20. Oktober 2004 14:49

Beitrag von Carsten »

omg
Das kommt davon wenn man rumtestet und nicht alten coder wieder löscht

Code: Alles auswählen

if (list.count()>1) { 
Antworten