Среда, 27 Ноября 2024, 16:34

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Столкновение с платформой.
KreatifchkДата: Среда, 04 Ноября 2015, 00:17 | Сообщение # 1
был не раз
Сейчас нет на сайте
Делаю платформер. Нужно чтоб персонаж не падал с платформы пока он на ней стоит. А когда он сойдет с нее упасть обратно. Я попытался сделать это так: создал два прямоугольника, для платформы и для персонажа; сделал функцией с intersect условие, что если оно верно, то после прыжка вверх падение обратно не сработает и персонаж остается на платформе. Однако вся проблема в том, что условие срабатывает только когда персонаж в прыжке пролетает сквозь платформу, когда он стоит на ней столкновения уже нет, как сделать чтоб когда персонаж стоит на платформе условие тоже было верно?
YellowAfterlifeДата: Среда, 04 Ноября 2015, 13:54 | Сообщение # 2
Сейчас нет на сайте
Всегда можно сделать так, как это работает в GameMaker'е:
1. Сделать игроку функцию, возвращающую, столкнется ли он с каким-либо твердым объектом, если его сместить на указанное количество пикселей по x\y:
Код
boolean placeFree(float dx, float dx) {
// сместить на указанные координаты:
this.rect.y += dx;
this.rect.x += dx;
// перебор платформ:
Platform[] platforms = Game.platforms; // список платформ
int n = platforms.length;
boolean result = true;
for (int i = 0; i < n; i++) if (platforms[i].rect.Intersect(this.rect)) {
  // Если на новой позиции игрок пересекает i-ую платформу, пометить результат и прекратить перебор.
  result = false;
  break;
}
// сместить обратно:
this.rect.x -= dx;
this.rect.y -= dy;
// вернуть результат
return result;
}

2. Построить логику на этом:
Код
int walkSpeed = 4; // скорость ходьбы (пкс\кадр)
float ySpeed = 0f; // текущая вертикальная скорость (пкс\кадр)
float jumpVelocity = 10f; // прирост вертикальной скорости при прыжке
float gravity = 0.5f; // "сила" гравитации
void update() { // выполняется раз в кадр
boolean isOnGround = !placeFree(0f, 1f);
if (isOnGround) { // стоит на земле
  if (jumpPressed()) { // была нажата кнопка прыжка?
   this.ySpeed = -this.jumpVelocity;
  }
} else { // в воздухе: применить гравитацию
  this.ySpeed += this.gravity;
}
// вычислить горизонтальное направление движения (-1\0\1):
int sx = 0;
if (leftDown()) sx -= 1;
if (rightDown()) sx += 1;
// само горизонтальное движение (если нужно):
if (sx != 0) for (int i = 0; i < this.walkSpeed; i++) {
  if (placeFree(sx, 0f)) { // можно сдвинуться на пиксель в направлении - сдвигаемся
   this.rect.x += sx;
  } else { // ударились в стену. прекратить цикл
   break;
  }
}
// вертикальное движение:
int ay = (int)(this.ySpeed + 0.5); // округлить скорость
int sx = 0; // направление движения по вертикали
if (ay > 0) {
  sx = 1;
} else if (ay < 0) {
  ay = -ay;
  sx = -1;
}
// само вертикальное движение:
if (sy != 0) for (int i = 0; i < ay; i++) {
  if (placeFree(0f, sy)) { // можно сдвинуться на пиксель в направлении - сдвигаемся
   this.rect.y += sy;
  } else {
   this.ySpeed = 0f; // сбрасываем вертикальную скорость при ударе об платформы
   break;
  }
}
}


Вариант с неиспорченным форматированием: https://gist.github.com/anonymous/f444b4e781c555bc785a




Сообщение отредактировал YellowAfterlife - Среда, 04 Ноября 2015, 14:04
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг