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