Ich habe eine einfache Kollisionserkennungsroutine unter Verwendung von AABBs zwischen meinem Hauptspiel-Sprite und verschiedenen Plattformen implementiert (siehe Code unten). Es funktioniert großartig, aber ich führe jetzt die Schwerkraft ein, um meinen Charakter fallen zu lassen, und es zeigt sich einige Probleme mit meiner CD-Routine.
Ich denke, der Kern der Sache ist, dass meine CD-Routine das Sprite entlang der Achse zurückbewegt, in der es am wenigsten in das andere Sprite eingedrungen ist . Wenn es sich also mehr in der Y-Achse als in der X-Achse befindet, wird es entlang der X-Achse zurückbewegt.
Jetzt fällt mein (Helden-) Sprite jedoch mit einer Geschwindigkeit von 30 Pixel pro Frame (es ist ein Bildschirm mit einer Höhe von 1504 - ich muss so schnell fallen, da ich versuchen möchte, die "normale" Schwerkraft zu simulieren, jedes langsamere sieht einfach komisch aus ) Ich bekomme diese Probleme. Ich werde versuchen, mit ein paar Bildern zu zeigen, was passiert (und was meiner Meinung nach es verursacht - obwohl ich nicht sicher bin): (Code unter den Bildern).
Ich würde mich über einige Vorschläge freuen, wie Sie dieses Problem umgehen können.
Zur Verdeutlichung ist es im obigen rechten Bild vielleicht etwas irreführend, wenn ich sage, dass die Position "falsch" korrigiert wurde. Der Code selbst funktioniert korrekt für die Art und Weise, wie er geschrieben wurde, oder anders ausgedrückt, der Algorithmus selbst funktioniert, wenn er sich so verhält, wie ich es erwarten würde, aber ich muss sein Verhalten ändern, um dieses Problem zu verhindern. Ich hoffe, das verdeutlicht meine Kommentare im Bild .
Mein Code
public boolean heroWithPlatforms(){
//Set Hero center for this frame
heroCenterX = hero.xScreen+(hero.quadWidth/2);
heroCenterY = hero.yScreen+(hero.quadHeight/2);
//Iterate through all platforms to check for collisions
for(x=0;x<platformCoords.length;x+=2){
//Set platform Center for this iteration
platformCenterX = platformCoords[x]+(platforms.quadWidth/2);
platformCenterY = platformCoords[x+1]+(platforms.quadHeight/2);
// the Dif variables are the difference (absolute value)
// of the center of the two sprites being compared (one for X axis difference
//and on for the Y axis difference)
difX = Math.abs(heroCenterX-platformCenterX);
difY = Math.abs(heroCenterY-platformCenterY);
//If 1
//Check the difference between the 2 centers and compare it to the vector (the sum of
//the two sprite's widths/2. If it is smaller, then the sprites are pverlapping along
//the X axis and we can now proceed to check the Y axis
if (difX<vecXPlatform){
//If 2
//Same as above but for the Y axis, if this is also true, then we have a collision
if(difY<vecYPlatform){
//we now know sprites are colliding, so we now need to know exactly by how much
//penX will hold the value equal to the amount one sprite (hero, in this case)
//has overlapped with the other sprite (the platform)
penX = vecXPlatform-difX;
penY = vecYPlatform-difY;
//One sprite has penetrated into the other, mostly in the Y axis, so move sprite
//back on the X Axis
if (penX < penY){hero.xScreen-=penX*(heroCenterX-platformCenterX>=0 ? -1 : 1);}
//Sprite has penetrated into the other, mostly in the X asis, so move sprite
//back on the Y Axis
else if (penY < penX) {hero.yScreen-=penY*(heroCenterY-platformCenterY>=0 ? -1 : 1);}
return true;
}//Close 'If' 2
} //Close 'If' 1
}
//Otherwise, no collision
return false;
}
//One sprite has penetrated into the other, mostly in the Y axis, so move sprite //back on the X Axis