使用线程在JavaFX中移动矩形形状

时间:2014-06-16 21:44:51

标签: java multithreading javafx game-physics shape

我有一个奇怪的问题,我需要帮助。 这是一个非常简单的应用程序。我有一个保存在Car对象中的Rectangle Shape。

public class Car {

    private Rectangle rect;
    private TheFourCarDeadlock.direction direction;

    public Car(Rectangle r, TheFourCarDeadlock.direction d) {
        this.rect = r;
        this.direction = d;
    }

    public void move() {

        double xPos;
        double yPos;
        switch (direction) {
            case left:
                // make sure x is a positive nr between 0 and 600
                xPos = (rect.getX() - 1) % 600;
                if (xPos < 0) {
                    xPos = 600;
                }
                rect.setX(xPos);
                System.out.println(String.format("move left, x: %1.0f", xPos));
                break;
            case right:
                xPos = (rect.getX() + 1) % 600;
                rect.setX(xPos);
                System.out.println(String.format("move right, x: %1.0f", xPos));
                break;
            case up:
                yPos = (rect.getY() - 1) % 600;
                rect.setY(yPos);
                break;
            case down:
                yPos = (rect.getY() + 1) % 600;
                rect.setY(yPos);
                break;
            default:
                throw new AssertionError(direction.name());

        }
    }
}

Car类根据设定的方向向左或向右移动汽车对象。

public class TheFourCarDeadlock extends Application {

    int maxWidth = 600;
    int maxHeight = 600;

    Car carFromLeft;
    Car carFromRight;

    public static enum direction {

        left, right, up, down
    };

    @Override
    public void start(Stage primaryStage) {

        // setup
        Group root = new Group();
        Scene scene = new Scene(root, maxWidth, maxHeight);

        // cars
        // cars on left side going right
        Rectangle leftSide = new Rectangle(0, 350 - 10, 20, 20);
        leftSide.setFill(Color.BLUE);
        root.getChildren().add(leftSide);
        carFromLeft = new Car(leftSide, direction.right);


        // cars on right side going left
        Rectangle rightSide = new Rectangle(600, 250 + 10, -20, -20);
        rightSide.setFill(Color.BLUE);
        root.getChildren().add(rightSide);
        carFromRight = new Car(rightSide, direction.left);

        primaryStage.setTitle("The Four Car Deadlock");
        primaryStage.setScene(scene);
        primaryStage.show();

        Thread t = new Thread(new DrawRunnable());
        t.start();
    }

    public void moveCars() {

        carFromLeft.move();
        carFromRight.move();

    }

    private class DrawRunnable implements Runnable {

        @Override
        public void run() {
            try {
                while (true) {
                    Thread.sleep(30);
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            moveCars();
                        }
                    });
                }
            } catch (InterruptedException ex) {
                System.out.println("Interrupted");
            }
        }

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

在主应用程序中,我创建了两辆车,一辆向右,一辆向左走。我用螺纹t每30毫秒移动一辆汽车。

现在,我不明白的一个奇怪的事情是 carFromLeft 工作正常并显示在表单中,然后按照我的计划向右移动。 carFromRight ,具有完全相同的代码并采用相同的方式。只是静止不动......即使在输出中它打印出矩形的位置x正在改变它应该的样子。

在输出中我得到了这个:

move left, x: 436
move right, x: 165
move left, x: 435
move right, x: 166
move left, x: 434
move right, x: 167
move left, x: 433
move right, x: 168
move left, x: 432
move right, x: 169
move left, x: 431
move right, x: 170
move left, x: 430

因此矩形改变了它们的x位置。一个向左,一个向右。但只有向右移动的那个更新并以形式绘制......发生了什么?

1 个答案:

答案 0 :(得分:1)

你给了一个负高度和宽度的矩形 - 如果你给它一个正面的,它会显示并从左到右移动。

BTW - 在JavaFX中,您不应该使用线程来实现此功能,因为您使用Platform.runLater调用向系统发送垃圾邮件。您应该使用动画,例如TranslateTransition