JavaFX:使用AnimationTimer移动矩形

时间:2019-04-11 22:54:53

标签: java

我正在尝试编写一个非常简单的Pong游戏,我想这就是这个旧游戏的名称,在该游戏中,玩家和一堆积木之间的球反弹,球上下运动。播放器可以在底部水平移动。

所以基本上只是一些移动的矩形,最终它们应该发生碰撞等等。

但是,我可以允许播放器通过按钮移动Rectangle,但是我无法在AnimationTimer的帮助下使对象移动。 (javafx.animation.AnimationTimer)

我已经进行了很多搜索,但只找到了一些示例,这些示例中有我设法避免的错误。 (例如,像这样的AnimationTimer & JavaFX: Rectangle won't move horizontally using the setTranslateX() method. How to move Rectangle?)。 我尝试对其进行调试,以查看意外发生的位置,但找不到。这是我的代码:

package bounceBall;

import java.util.ArrayList;
import java.util.List;
import javafx.scene.control.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class BounceBallApp  extends Application {

    private Pane root = new Pane();
    private Sprite player =  new Sprite(400, 500, 40, 4, "player", Color.BLUE);
    private boolean play;

    private Parent createContent() {
        this.play = false;
        root.setPrefSize(800, 600);

    root.getChildren().add(player);

    AnimationTimer timer = new AnimationTimer() {

        @Override
        public void handle(long now) {
            update();
        }

    };

    timer.start();

    for (int y = 0; y < 10; y++) {
        for (int x = 0; x < 40; x++) {
            Sprite s = new Sprite(20*x, y*8, 18, 5, "brick", Color.AQUA);
            root.getChildren().add(s);
        }
    }

    return root;
}


private List<Sprite> getSprites(){
    List<Sprite> list = new ArrayList<Sprite>();
    for (Node n : root.getChildren()) {
        if (n instanceof Sprite) {
            Sprite s = (Sprite)n;
            list.add(s);
        }
    }
    return list;
}



private void update() {

    getSprites().forEach(b -> {
        if (b.type.equals("bullet")) {
            b.moveRight(b.getXspeed());
            b.moveDown(b.getYspeed());
        }
    });
}



@Override
public void start(Stage primaryStage) throws Exception {
    Scene scene = new Scene(createContent());

    scene.setOnKeyPressed(e -> {
        //as soon as any key gets hit the game starts with the shoot method
        if (play == false) {
            shoot(player);
            play = true;
        }

        switch (e.getCode()) {
            case A:{
                player.moveLeft(10);
                break;
            }
            case D:{
                player.moveRight(10);
                break;
            }
            default:
                break;
        }
    });

    primaryStage.setScene(scene);
    primaryStage.setTitle("Bounce Ball");
    primaryStage.show();

}



/*this method should be called once at the beginning to initiate the ball
the ball appears but it doesn't move, instead remains still
if I try to make the player move with AnimationTimer it doesn't work either, it works just by pressing keys*/

private void shoot(Sprite who) {
    Sprite s = new Sprite((int)who.getTranslateX(), (int)who.getTranslateY()-2, 4, 4, "bullet", Color.BLACK);
    s.setYspeed(-10);
    root.getChildren().add(s);
    System.out.println(root.getChildren().size());
}


private static class Sprite extends Rectangle {

    final String type;
    private int Xspeed, Yspeed;

    public Sprite(int x, int y, int w, int h, String type, Color color) {
        super(w, h, color);
        this.type = type;
        setTranslateX(x);
        setTranslateY(y);
        Xspeed = 0;
        Yspeed = 0;
    }

    public void moveLeft(int d) {
        setTranslateX(getTranslateX() - d);
    }

    public void moveRight(int d) {
        setTranslateX(getTranslateX() + d);
    }

    public void moveUp(int d) {
        setTranslateX(getTranslateY() - d);
    }

    public void moveDown(int d) {
        setTranslateX(getTranslateY() + d);
    }

    public int getXspeed() {
        return Xspeed;
    }

    public int getYspeed() {
        return Yspeed;
    }

    public void setXspeed(int xspeed) {
        Xspeed = xspeed;
    }

    public void setYspeed(int yspeed) {
        Yspeed = yspeed;
    }

}

public static void main(String[] args) {
    launch(args);
}

}

我希望球在开始时会直线上升,但是它出现在错误的位置(距离我期望的位置大约50像素)。 最重要的是它不会移动。

非常感谢。

0 个答案:

没有答案