Einzelnen Beitrag anzeigen
Alt 25-07-2010, 01:50   #15 (permalink)
LilaQ
q00bar @ work
 
Benutzerbild von LilaQ
 
Registriert seit: May 2010
Beiträge: 88
So, stehe leider momentan wieder vor einem größeren Problem.

Bis gestern konnten die Würmer beim Springen (ein Sprung geht nach oben und zur Seite, je nachdem in welche Richtung der Wurm schaut) immer noch in Objekte der Map "reinspringen". Durch das reinspringen werden sie im nächsten Berechnungszyklus auf den nächsthöheren Punkt gesetzt.

So lassen sich auch dünne Wände etc. einfach durchspringen. So sollte das ganze natürlich nicht sein.

Versuche jetzt seit knapp 10 Stunden eine Lösung für das Problem zu finden.
Wenn der Wurm von unten gegen eine Decke springt, soll er natürlich wieder nach unten abprallen.

Daher dachte ich mir, dass ich erst einmal eine Funktion schreibe, die die Pixel zwischen dem aktuellen Punkt und dem nächsten Punkt im Sprung überprüft (da diese ja beim Sprung mehr oder weniger übergangen werden).

Bin grad schon wieder leicht am verzweifeln und mir fällt auch einfach nichts mehr ein, was ich noch probieren könnte.

Daher werde ich auch nicht mehr viel erklären, sondern jetzt mal ein paar Ausschnitte aus meinem Quelltext posten, vielleicht kann mir da nochmal jemand auf die Sprünge helfen, sonst verlier ich hier bald noch Haare

Code:
private function gravityHandler(e:Event)		:void
		{
			//	Wenn der Wurm auf der Map steht
			if((wormHitTest(new Point(Worm(e.target).x, Worm(e.target).y)))&&(wormHitTest(new Point(Worm(e.target).x, Worm(e.target).y-1))))
			{
				Worm(e.target).VelocityY = 0;
				Worm(e.target).y = YcoordFromMap(Worm(e.target)) + 2;
				Worm(e.target).isFalling = false;
				
				//	Wenn der Wurm sich seitlich bewegen soll:
				if(Worm(e.target).VelocityX != 0)
					//	Steigung wird berücksichtigt
					//	Ist es zu steil, geht der Wurm nicht weiter
					if(!wormHitTest(new Point((Worm(e.target).x + Worm(e.target).VelocityX), (Worm(e.target).y - MAX_STEIGUNG)))) 
					{
						Worm(e.target).x += Worm(e.target).VelocityX;
						Worm(e.target).y = YcoordFromMap(Worm(e.target)) + 2;
						Worm(e.target).VelocityX = 0;
					}
			}
			
			//	Wurm fällt oder springt
			else 
			{
				Worm(e.target).VelocityY 	+= _curSettings.GRAVITY;
				Worm(e.target).y 			+= Worm(e.target).VelocityY;
				Worm(e.target).x 			+= Worm(e.target).VelocityX;
			} 
		}
Hab noch einiges rausgenommen um es übersichtlicher zu halten.

wormHitTest() prüft nur den übergebenen Punkt mit der Map und ob eine Kollision damit stattfindent

YcoordFromMap() findet nur den nächsthöheren Y-Punkt heraus für den übergebenen Wurm

Die Funktion die ich vorhin ansprach um die Punkte zwischen 2-Sprung-Stadien zu überprüfen habe ich so geschrieben (momentan nicht implementiert im gravityHandler):

Code:
private function kollisionZwischenPunkten(srcX:uint, srcY:uint, destX:uint, destY:uint)	:Array
		{
			var dx: uint = Math.abs(destX - srcX);
			var dy: uint = Math.abs(destY - srcY);
			var y: uint = srcY;
			var returnArray:Array = new Array();
			var step:Number = dy / dx;
			for (var i : int = srcX;i < destX;i++) 
			{
				if(wormHitTest(new Point(i, y)))
				{
					returnArray[0] = "true";
					returnArray[1] = i;	// X-Wert bei Kollision
					returnArray[2] = y; // Y-Wert bei Kollision
					return returnArray;
				}
				y += step;
			}
			returnArray[0] = "false";
			return returnArray;
		}
So, und im Endeffekt möchte ich eigentlich nur dass die Würmer nicht mehr durch Wände / Decken springen können, sondern davon abprallen -.-

Wäre wirklich ausserordentlich dankbar wenn mir da nochmal jemand mit helfen kann.

Danke euch im Voraus.

Mfg
LilaQ

Geändert von LilaQ (25-07-2010 um 01:59 Uhr)
LilaQ ist offline   Mit Zitat antworten