I want to make a very simple game, where the player (displayed as a rectangle) can shoot and as soon as the shots hit an enemy (displayed as an Circle) the circle will be removed.
The code itself works, but I have a strange problem. When the player "Shoots" before moving (using W A S D) then everything works fine. However, if the player moves right at the start of the game, I get the following error messages:
public class ShootTest extends Application{
//*************
//**VARIABLES**
//*************
private enum Direction {
UP, DOWN, LEFT, RIGHT;
}
private int BLOCK_SIZE = 20;
private int GAME_WIDTH = 30 * BLOCK_SIZE;
private int GAME_HEIGHT = 20 * BLOCK_SIZE;
private Timeline timeline = new Timeline();
private Stage window = new Stage();
Rectangle player = new Rectangle(BLOCK_SIZE, BLOCK_SIZE);
Circle test = new Circle(BLOCK_SIZE);
KeyFrame keyframe;
//***********
//***STAGE***
//***********
@Override
public void start(Stage primaryStage) throws Exception {
Pane root = new Pane();
root.setPrefSize(GAME_WIDTH, GAME_HEIGHT);
root.setStyle(""
+ "-fx-background-image: url(images/gras.png);"
+ "-fx-background-size: 20 20;"
+ "-fx-background-repeat: repeat");
player.setTranslateX(BLOCK_SIZE * 13);
player.setTranslateY(BLOCK_SIZE * 14);
test.setTranslateX(BLOCK_SIZE * 14);
test.setTranslateY(BLOCK_SIZE * 4);
root.getChildren().addAll(player, test);
Scene scene = new Scene(root);
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
switch (event.getCode()) {
case SPACE:
Rectangle shoot = new Rectangle(BLOCK_SIZE, BLOCK_SIZE);
Image shotImage = new Image("images/food.png");
ImagePattern shotPattern = new ImagePattern(shotImage);
shoot.setFill(shotPattern);
shoot.setTranslateX(player.getTranslateX());
shoot.setTranslateY(player.getTranslateY() - BLOCK_SIZE);
root.getChildren().add(shoot);
Direction direction = Direction.UP;
System.out.println("Schuss!");
keyframe = new KeyFrame(Duration.seconds(0.1), new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
switch (direction) {
case UP:
shoot.setTranslateY(shoot.getTranslateY() - BLOCK_SIZE);
shoot.setTranslateX(shoot.getTranslateX());
break;
default:
break;
}
//Kollision
if(shoot.getTranslateX() == test.getTranslateX() && shoot.getTranslateY()
== test.getTranslateY()) {
System.out.println("Getroffen");
root.getChildren().remove(test);
}
}
});
break;
case D:
player.setTranslateX(player.getTranslateX() + BLOCK_SIZE);
player.setTranslateY(player.getTranslateY());
break;
case A:
player.setTranslateX(player.getTranslateX() - BLOCK_SIZE);
player.setTranslateY(player.getTranslateY());
break;
case W:
player.setTranslateX(player.getTranslateX());
player.setTranslateY(player.getTranslateY() - BLOCK_SIZE);
break;
case S:
player.setTranslateX(player.getTranslateX());
player.setTranslateY(player.getTranslateY() + BLOCK_SIZE);
break;
default:
break;
}
timeline.getKeyFrames().add(keyframe);
timeline.setCycleCount(timeline.INDEFINITE);
timeline.play();
}
});
window = primaryStage;
window.setScene(scene);
window.setTitle("Test");
window.setResizable(false);
window.show();
}
public static void main(String[] args) {
launch(args);
}
}