-
-
Save anonymous/f444b4e781c555bc785a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
// ... | |
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; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment