Implementé una rutina simple de detección de colisiones usando AABB entre mi sprite principal del juego y varias plataformas (consulte el código a continuación). Funciona muy bien, pero ahora estoy introduciendo la gravedad para hacer que mi personaje se caiga y se muestran algunos problemas con mi rutina de CD.
Creo que el quid de la cuestión es que mi rutina de CD mueve el sprite hacia atrás a lo largo del eje en el que ha penetrado la menor cantidad en el otro sprite. Entonces, si está más en el eje Y que en el X, entonces lo moverá hacia atrás a lo largo del eje X.
Sin embargo, ahora mi sprite (héroe) ahora está cayendo a una velocidad de 30 píxeles por fotograma (es una pantalla de 1504 de altura; necesito que caiga tan rápido como quiero intentar simular la gravedad 'normal', cualquier más lento solo se ve raro ) Estoy teniendo estos problemas. Intentaré mostrar lo que está sucediendo (y lo que creo que lo está causando, aunque no estoy seguro) con algunas imágenes: (Codifique las imágenes a continuación).
Agradecería algunas sugerencias sobre cómo solucionar este problema.
Para aclarar, en la imagen de arriba a la derecha, cuando digo que la posición se corrige 'incorrectamente', eso puede ser un poco engañoso. El código en sí está funcionando correctamente para la forma en que está escrito, o dicho de otra manera, el algoritmo en sí mismo si se comporta como lo esperaría, pero necesito cambiar su comportamiento para evitar que este problema suceda, espero que aclare mis comentarios en la imagen .
Mi código
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