J'ai implémenté une routine de détection de collision simple en utilisant des AABB entre mon sprite de jeu principal et diverses plates-formes (veuillez voir le code ci-dessous). Cela fonctionne très bien, mais j'introduis maintenant la gravité pour faire tomber mon personnage et cela a montré des problèmes avec ma routine de CD.
Je pense que le nœud du problème est que ma routine de CD fait reculer le sprite le long de l'axe dans lequel il a pénétré le moins dans l'autre sprite. Donc, s'il est plus dans l'axe Y que dans le X, il le fera reculer le long de l'axe X.
Cependant, maintenant mon sprite (héros) tombe maintenant à un taux de 30 pixels par image (c'est un écran de 1504 de haut - j'en ai besoin pour tomber aussi vite car je veux essayer de simuler la gravité `` normale '', tout plus lent a juste l'air bizarre) ) Je reçois ces problèmes. Je vais essayer de montrer ce qui se passe (et ce que je pense en être la cause - bien que je ne sois pas sûr) avec quelques images: (Code ci-dessous les images).
J'apprécierais quelques suggestions sur la façon de contourner ce problème.
Pour plus de précision, dans l'image ci-dessus à droite, quand je dis que la position est corrigée `` incorrectement '', c'est peut-être un peu trompeur. Le code lui-même fonctionne correctement pour la façon dont il est écrit, ou autrement dit, l'algorithme lui-même s'il se comporte comme je m'y attendrais, mais je dois changer son comportement pour éviter que ce problème ne se produise, j'espère que cela clarifie mes commentaires dans l'image .
Mon 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