-4

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);

    }

    

}

Error

Federico klez Culloca
  • 24,336
  • 15
  • 57
  • 93
Thriest
  • 1
  • 2

0 Answers0