Я сейчас программирую на Java FX и пытаюсь ознакомиться с реализацией таких вещей, как карты тайлов, гравитация, спрайтовые анимации и т. Д. c, так как я довольно новичок в этом. В настоящее время у меня есть прямоугольник (который скоро станет спрайтом), который перемещается влево и вправо на карте тайлов, которая хранится внутри. Я пытаюсь сделать функцию прыжка для прямоугольника, и я реализовал гравитацию. Тем не менее, у меня нет функции обнаружения столкновений на полу карты тайлов, поэтому игрок просто проваливается через платформы карт тайлов. Моя программа использует наследование, поэтому мое главное - это то, где я рендеринг на моей карте тайлов, а мой класс игрока (наследующий от моего спрайтового класса) - это место, где все ключевые слушатели предназначены для движений игрока. Я пытался исследовать, как использовать обнаружение столкновений на картах плиток, но все результаты включают в себя наличие карты игрока и плиток в одном классе. Вот код для некоторого контекста:
Основной класс для рендеринга карты уровня:
public Scene MainGame() {
Lw = LevelMap.LEVEL1[0].length() * 60;
for (int i = 0; i < LevelMap.LEVEL1.length; i++) {
String line = LevelMap.LEVEL1[i];
for (int j = 0; j < line.length(); j++) {
switch (line.charAt(j)) {
case '0':
break;
case '1':
Node platform = createEntity(j * 60, i * 58, 60, 60, Color.BROWN);
LM.add(platform);
break;
}
}
}
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
player.move();
}
};
timer.start();
appRoot.getChildren().addAll(gameRoot, player.getRect());
appRoot.setId("appR");
final Scene gameWindow = new Scene(appRoot, screenWidth, screenHeight);
gameWindow.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
player.KeyPressed(event);
}
});
gameWindow.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
player.KeyReleased(event);
}
});
return gameWindow;
}
Класс игрока:
private Rectangle rect;
private String color;
private boolean jump, left, right;
private KeyCode jumpKey, leftKey, rightKey;
int xSpeed;
int ySpeed;
private boolean canJump;
protected double gravity;
private boolean falling = true;
private double upForce;
private int jumpForce;
private boolean jumping;
private int Lw;
int getTranslateX;
public Player(String Name, double xPos, double yPos, int width, int height, int speed) {
super(Name, xPos, yPos, width, height, speed);
rect = new Rectangle(xPos, yPos, width, height);
rect.setFill(Color.BLUE);
rect.setArcWidth(30);
rect.setArcHeight(30);
leftKey = KeyCode.LEFT;
rightKey = KeyCode.RIGHT;
jumpKey = KeyCode.SPACE;
gravity = 0.5;
xSpeed = 10;
ySpeed = 10;
}
public void KeyPressed(javafx.scene.input.KeyEvent code) {
KeyCode j = code.getCode();
switch (j) {
case LEFT:
left = true;
System.out.println("Left pressed");
break;
case RIGHT:
right = true;
System.out.println("Right pressed");
break;
case SPACE:
jump = true;
System.out.println("Space pressed");
break;
}
}
public void KeyReleased(javafx.scene.input.KeyEvent code) {
KeyCode j = code.getCode();
switch (j) {
case LEFT:
left = false;
System.out.println("Left Released");
break;
case RIGHT:
right = false;
System.out.println("Right released");
break;
case SPACE:
jump = false;
System.out.println("Space released");
break;
}
}
public void move() {
if (right) {
xPos += xSpeed;
}
if (left) {
xPos -= xSpeed;
}
if (jump && canJump && !jumping) {
jumpForce = 10;
jumping = true;
}
else if (jumpForce > 0) {
jumpForce--;
}
else {
jumping = false;
}
if (canJump) {
upForce = -gravity;
}
else {
upForce = 0;
}
rect.setX(xPos);
rect.setY(yPos);
}
} В идеале я хотел бы, чтобы обнаружение столкновений проходите в классе игрока, любой совет / помощь приветствуется.