【发布时间】:2022-01-14 19:04:49
【问题描述】:
非常感谢您的帮助,我正在尝试创建 JavaFX 应用程序,我想开始在画布面板上创建一些东西,代码正在编译但没有效果,在我看来画布面板视图不是刷新了,也许一些规范会告诉我忘记了什么,我把整个类都扔进去了,代码下面是来自场景构建器的窗口结构和项目结构。
[![package com.example.rpgfxmaven;
import javafx.animation.AnimationTimer;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.AnchorPane;
import javafx.scene.media.MediaPlayer;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.io.IOException;
public class GameControler{
final int oryginalnyRozmiarLudzika = 16; // 16x16 tile
final int skala = 3;
final int rozmiarLudzika = skala * oryginalnyRozmiarLudzika;
final int dlugoscPlanszy = 20;
final int szerokoscPlanszy = 15;
final int dlugoscEkranu = rozmiarLudzika*dlugoscPlanszy;
final int szerokoscEkranu = rozmiarLudzika*szerokoscPlanszy;
@FXML
private Canvas canvaspane = new Canvas(dlugoscEkranu, szerokoscEkranu);
GraphicsContext content;
public static MediaPlayer mediaPlayer;
public void start(Stage primaryStage) throws IOException {
FXMLLoader loader = new FXMLLoader(this.getClass().getResource("maingame-window.fxml"));
AnchorPane anchorPane= loader.load();
anchorPane.setPrefSize(dlugoscEkranu+100, szerokoscEkranu+75);
Scene scene = new Scene(anchorPane);
primaryStage.setScene(scene);
primaryStage.show();
content = canvaspane.getGraphicsContext2D();
startGame();
}
public void startGame()
{
Timeline timeline = new Timeline(new KeyFrame(Duration.millis(10), e ->run(content)));
timeline.setCycleCount(Timeline.INDEFINITE);
}
public void run(GraphicsContext content) {
content.setFill(Color.BLUE);
content.fillRect(100, 100, rozmiarLudzika,rozmiarLudzika);
}
}
【问题讨论】:
-
这是一个控制器类,还是一个
Application子类?不应该两者兼而有之。 -
@James_D 你的意思是在控制器中不应该有启动方法等?我应该为它自己上课吗?但只是为了知道,在我的例子中,我该怎么做,如果我知道为什么画布不起作用,那么我将为此制作两个类
-
是的,控制器应该有一个单独的类。你没有把它作为
Application的子类,所以根本不清楚start(...)在哪里被调用。而且,正如其他人指出的那样,初始化注释为@FXML的字段总是不正确的。这里同时有太多错误的地方,也没有足够的信息来提供完整的答案。 -
如果你想刷新每一帧,那么研究 JavaFX 和 AnimationTimer 中的游戏循环。时间线可以工作,但帧上限默认为 60fps,即帧之间为 16 2/3 毫秒,因此持续时间为 10 毫秒的时间线的关键帧只会每 16 2/3 毫秒最大调用一次。