首页 > 解决方案 > 如何使用并行相机javafx

问题描述

作为学校的一个项目,我们正在制作一个爬山赛车的小副本。我们不想让课程本身移动,而是使用相机,但是一旦我们将相机添加到我们的场景中,它就像切断我们的图像一样,当我向右移动时,只有空白区域而不是我们的课程。你们中有人知道如何在 javafx 中使用 Parallel Cameras 吗?

我们正在使用 javafx 类 javafx.scene.ParallelCamera。

这是我们的游戏场景


import GameLogic.*;
import GameLogic.KeyEventHandler;
import GameLogic.MouseEventHandler;
import common.BaseScene;
import common.FancyAnimationTimer;
import common.Initializable;
import common.Navigator;
import gameobjects.Course;
import javafx.scene.ParallelCamera;

public class GameScene extends BaseScene implements Initializable {

    private Road road;
    private FancyAnimationTimer animationTimer;
    private Course courseMaker;
    private KeyEventHandler keyEventHandler;
    private ParallelCamera camera;

    public GameScene(Navigator navigator) {
        super(navigator);
    }

    @Override
    public void onInitialize() {

        keyEventHandler = new KeyEventHandler();

        courseMaker = new Course();


        camera = new ParallelCamera();
        camera.setLayoutX(0);
        camera.setLayoutY(0);
        camera.setNearClip(0.1);
        camera.setFarClip(2000.0);

        this.setCamera(camera);

        road = new Road(navigator, () -> animationTimer.stop(), keyEventHandler, camera);

        MouseEventHandler mouseEventHandler = new MouseEventHandler(road);
        CollisionHandler  collisionHandler = new CollisionHandler(road);

        CourseBoundingBox courseBoundingBox = new CourseBoundingBox();
        this.setOnMouseClicked(mouseEventHandler);
        this.setOnKeyPressed(keyEventHandler::onKeyPressed);
        this.setOnKeyReleased(keyEventHandler::onKeyReleased);
        road.load();
        animationTimer = new FancyAnimationTimer() {
            @Override
            protected void doHandle(double elapsedTime) {
                road.update(elapsedTime, courseMaker);
                road.draw(canvas.getGraphicsContext2D(), courseMaker);
                courseBoundingBox.draw(canvas.getGraphicsContext2D());
            }
        };
        animationTimer.start();
    }

}

这是我们的课程


import gui.Images;
import javafx.scene.canvas.GraphicsContext;

public class Course {
    private double x = 0;
    private double y = -360;
    private int carSpeed = 0;
    private int carTopSpeed = 1000;
    private int inputRightPressCounter = 0;
    private int inputLeftPressCounter = 0;
    private int topSpeedDifference = 0;

    public void setX(double x) {
        this.x = x;
    }

    public void drawCourse(GraphicsContext gc) {
        double imageWidth = Images.COURSEPART1.getWidth();
        gc.drawImage(Images.COURSEPART1, x, y, 6030, 1440);
       gc.drawImage(Images.COURSEPART2, x + imageWidth, y);
       gc.drawImage(Images.COURSEPART3, x + 2 * imageWidth, y - 9);
       gc.drawImage(Images.COURSEPART4, x + 3 * imageWidth, y + 12);
       gc.drawImage(Images.COURSEPART5, x + 4 * imageWidth, y + 12);
       gc.drawImage(Images.COURSEPART1, x + 5 * imageWidth, y);
       gc.drawImage(Images.COURSEPART2, x + 6 * imageWidth, y);
        gc.drawImage(Images.COURSEPART3, x + 7 * imageWidth, y - 9);
        gc.drawImage(Images.COURSEPART4, x + 8 * imageWidth, y + 12);
        gc.drawImage(Images.COURSEPART5, x + 9 * imageWidth, y + 12);
    }
} 

这就是我们的道路更新方法:

        physicWorld.update(elapsedTime);
        if(keyEventHandler.isInputRight()){
            gameCar.driveRight();
            camera.setLayoutX(gameCar.getTransform().getTranslationX());
        }
        if(keyEventHandler.isInputLeft()) {
            gameCar.driveLeft();
            camera.setLayoutX(gameCar.getTransform().getTranslationX());
        }
    }

这是我第一次在 stackoverflow 上问一些问题,如果您对我未来的问题有一些提示,请告诉我:)

谢谢你的帮助

标签: javajavafx2d-games

解决方案


推荐阅读