Ho implementato una semplice routine di rilevamento delle collisioni usando AABB tra il mio sprite di gioco principale e varie piattaforme (vedi il codice sotto). Funziona benissimo, ma ora sto introducendo la gravità per far cadere il mio personaggio e ha mostrato alcuni problemi con la mia routine di CD.
Penso che il nocciolo della questione sia che la mia routine di CD sposta lo sprite indietro lungo l'asse in cui è penetrato il minimo nell'altro sprite. Quindi, se è più nell'asse Y che nella X, lo sposta indietro lungo l'asse X.
Tuttavia, ora il mio sprite (eroe) ora sta cadendo a una velocità di 30 pixel per fotogramma (è uno schermo alto 1504 - ne ho bisogno per cadere così velocemente come voglio provare a simulare la gravità "normale", qualsiasi più lento sembra strano ) Ricevo questi problemi. Proverò a mostrare ciò che sta accadendo (e ciò che penso stia causando - anche se non sono sicuro) con alcune immagini: (Codice sotto le immagini).
Gradirei alcuni suggerimenti su come aggirare questo problema.
Per un chiarimento, nella figura in alto a destra, quando dico che la posizione è corretta "in modo errato", forse è un po 'fuorviante. Il codice stesso funziona correttamente per come è scritto o, in altre parole, l'algoritmo stesso se si comporta come mi aspetterei, ma devo cambiare il suo comportamento per fermare questo problema, spero che chiarisca i miei commenti nella foto .
Il mio codice
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