Хотелось бы узнать, в каком направлении игрок попадает на плитку ландшафта (просто вверх / вниз, влево / вправо).Все, что я нахожу, либо слишком простое, либо гораздо более сложное и, казалось бы, слишком много для того, что мне нужно, например, с AABB (если трудно сказать, у моего мозга есть проблемы с перевариванием того, что составляет действительно длинные уравнения).То, что я получил до сих пор, является результатом того, что мы потратили большую часть сегодняшнего дня на чтение и эксперименты:
public int move(double toX, double toY) {
int col = COLLISION_NONE; //these are bit flags, in case I collide with a block to my right as well as below me
double nextX = mX+(toX*main.getDelta()); //delta regulates speed
double nextY = mY+(toY*main.getDelta());
if(mTerrainCollision){
int w = GameView.GameLoop.TILE_WIDTH;
int h = GameView.GameLoop.TILE_HEIGHT;
for(int i = -2; i <= 2; i++) //broad tile picking will be optimized later, better trace around players path
for(int j = -2; j <= 2; j++) {
GameTerrain.Block block = main.mTerrain.get(((int)Math.round(mX)/w)+i,((int)Math.round(mY)/h)+j);
if(block.type != GameTerrain.BLOCK_TYPE_NONE) {
if(nextX+w >= block.x() && mX+w <= block.x()){ //COLLISION ON THE RIGHT?
if(mY+h > block.y() && mY < block.y()+h) { //<THIS is a problem line, see below
nextX = block.x() - w;
xMomentum = 0;
col |= COLLISION_RIGHT;
}
}
else if(nextX < block.x()+w && mX >= block.x()+w){ //COLLISION ON THE LEFT?
if(mY+h > block.y() && mY < block.y()+h) { //same as above, make sure were on the same plane
nextX = block.x() + w;
xMomentum = 0;
col |= COLLISION_LEFT;
}
}
if(nextY+h >= block.y() && mY+h <= block.y()){ //COLLISION ON THE BOTTOM?
if(mX+w > block.x() && mX < block.x()+w) { //make sure were on the same plane
nextY = block.y() - h;
yMomentum = 0;
col |= COLLISION_DOWN;
}
}
else if(nextY < block.y()+h && mY >= block.y()+h){ //COLLISION ON THE TOP?
if(mX+w > block.x() && mX < block.x()+w) { //make sure were on the same plane
nextY = block.y() + h;
yMomentum = 0;
col |= COLLISION_UP;
}
}
}
}
}
mX = nextX;
mY = nextY;
return col;
}
Это работает ... в основном.Игрок не будет проходить через блоки даже после долгих снов, делая дельта-ракету.Само обнаружение столкновения работает, если только предыдущая позиция игрока (mX / mY) не находится в той же плоскости, что и блок, который мы проверяем (см. Закомментированную строку с «THIS ...»).Скажем, у нас идеальная диагональ к блоку, и мы движемся прямо к нему, игрок будет проноситься прямо.Некоторое время я чесал голову, пытаясь выяснить, как решить эту последнюю проблему, желательно без серьезной перестройки всего, но если это придет к этому, о, хорошо!Меня интересуют только простые данные о столкновениях для таких вещей, как «Дотронулся ли я до пола в этом фрейме? Хорошо, я могу прыгнуть», «Дотрагиваюсь ли я до стены сейчас?и т. д.