Я реализовал простую процедуру обнаружения столкновений, используя AABB между моим основным игровым спрайтом и различными платформами (см. Код ниже). Это прекрасно работает, но сейчас я ввожу гравитацию, чтобы заставить моего персонажа упасть, и это выявило некоторые проблемы с моей программой на CD.
Я думаю, что суть в том, что моя подпрограмма на компакт-диске перемещает спрайт назад вдоль оси, в которой он проник наименьшее количество в другой спрайт. Так что, если он находится больше по оси Y, чем по X, то он переместит его обратно вдоль оси X.
Тем не менее, теперь мой (герой) спрайт теперь падает со скоростью 30 пикселей на кадр (это экран высотой 1504 - мне нужно, чтобы он падал так быстро, как я хочу, чтобы попытаться симулировать «нормальную» гравитацию, любой медленнее просто выглядит странно ) Я получаю эти проблемы. Я попытаюсь показать, что происходит (и что, я думаю, вызывает это - хотя я не уверен) с несколькими картинками: (Код ниже изображения).
Буду признателен за некоторые предложения о том, как обойти эту проблему.
Для пояснения, на приведенном выше правом рисунке, когда я говорю, что позиция исправлена «неправильно», это, возможно, немного вводит в заблуждение. Сам код работает правильно для того, как он написан, или, иначе говоря, сам алгоритм, если он ведет себя так, как я ожидал, но мне нужно изменить его поведение, чтобы остановить эту проблему, надеюсь, это прояснит мои комментарии на картинке ,
Мой код
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