【发布时间】:2020-06-12 02:30:58
【问题描述】:
我见过很多在 Main 类中编写 AnimationTimer 和 KeyListener 的示例,但在其他类中没有。
我在“VolleyController”中尝试过How to write a KeyListener for JavaFX,但我不知道为什么它不起作用。
首先,我使用 KeyEvent 来移动图像,就像第一个代码一样。 第三个代码是我的 Main 类。我想像第二个代码一样重写移动图像的方法。
但是我在第二个代码中遇到了一些错误。我该如何处理?
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
public class VolleyController implements EventHandler<KeyEvent> {
double pika1LocationY = 556;
double pika2LocationY = 556;
double pika1LocationX = 0;
double pika2LocationX = 1050;
boolean pika2MoveLeft = false;
boolean pika2MoveRight = false;
boolean pika1MoveLeft = false;
boolean pika1MoveRight = false;
@FXML
ImageView pika1,pika2,ball;
@Override
public void handle(KeyEvent e) {
switch (e.getCode()) {
case ESCAPE:
Main.currentStage.setScene(Main.menuScene);
break;
case UP:
break;
case LEFT:
pika2MoveLeft = true;
break;
case RIGHT:
pika2MoveRight = true;
break;
case T:
break;
case F:
pika1MoveLeft = true;
break;
case H:
pika1MoveRight = true;
break;
}
move();
}
public void released(KeyEvent r) {
switch (r.getCode()) {
case LEFT:
pika2MoveLeft = false;
break;
case RIGHT:
pika2MoveRight = false;
break;
case F:
pika1MoveLeft = false;
break;
case H:
pika1MoveRight = false;
break;
}
}
public void move() {
if(pika1MoveLeft && pika1.getLayoutX()>=0)
pika1.setLayoutX(pika1.getLayoutX()-10);
if(pika1MoveRight && pika1.getLayoutX()<=440 )
pika1.setLayoutX(pika1.getLayoutX()+10);
if(pika2MoveLeft && pika2.getLayoutX()>600)
pika2.setLayoutX(pika2.getLayoutX()-10);
if(pika2MoveRight && pika2.getLayoutX()<1050)
pika2.setLayoutX(pika2.getLayoutX()+10);
}
}
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
public class VolleyController implements EventHandler<KeyEvent> {
double pika1LocationY = 556;
double pika2LocationY = 556;
double pika1LocationX = 0;
double pika2LocationX = 1050;
boolean pika2MoveLeft = false;
boolean pika2MoveRight = false;
boolean pika1MoveLeft = false;
boolean pika1MoveRight = false;
@FXML
ImageView pika1,pika2,ball;
//this gives me a syntax error about getScene(), but the following did not
Main.currentStage.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
switch (e.getCode()) {
case ESCAPE:
Main.currentStage.setScene(Main.menuScene);
break;
case UP:
break;
case LEFT:
pika2MoveLeft = true;
break;
case RIGHT:
pika2MoveRight = true;
break;
case T:
break;
case F:
pika1MoveLeft = true;
break;
case H:
pika1MoveRight = true;
break;
}
}}); //this told me to delete tokens
//this did not give me a syntax error
Main.currentStage.getScene().setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent r) {
switch (r.getCode()) {
case LEFT:
pika2MoveLeft = false;
break;
case RIGHT:
pika2MoveRight = false;
break;
case F:
pika1MoveLeft = false;
break;
case H:
pika1MoveRight = false;
break;
}
}
});
AnimationTimer timer=new AnimationTimer() {
@Override
public void handle(long now)
{
int pika1dx=0, pika2dx=0;
if(pika1MoveLeft) pika1dx-=10;
if(pika1MoveRight) pika1dx+=10;
if(pika2MoveLeft) pika2dx-=10;
if(pika2MoveLeft) pika2dx-=10;
PikaMoveBy(pika1dx,pika2dx);
}
};
timer.start();
}
public void PikaMoveBy(int pika1dx,int pika2dx)
{
if(pika1dx==0 || pika2dx==0) return;
final double pika1cx=pika1.getBoundsInLocal().getWidth()/2;
final double pika2cx=pika2.getBoundsInLocal().getWidth()/2;
double pika1x=pika1cx+pika1.getLayoutX()+pika1dx;
double pika2x=pika2cx+pika2.getLayoutX()+pika2dx;
PikaMoveTo(pika1x, pika2x);
}
public void PikaMoveTo(double pika1x, double pika2x)
{
final double pika1cx=pika1.getBoundsInLocal().getWidth()/2;
final double pika2cx=pika2.getBoundsInLocal().getWidth()/2;
if(pika1x-pika1cx>=0 && pika1x+pika1cx<450 && pika2x-pika2cx>600 && pika2x+pika2cx<1050)
{
pika1.relocate(pika1x-pika1cx, pika1_lct_y);
pika2.relocate(pika2x-pika2cx, pika2_lct_y);
}
}
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Main extends Application {
public static Stage currentStage;
public static Scene menuScene;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
currentStage=primaryStage;
Parent root=FXMLLoader.load(getClass().getResource("Menu.fxml"));
Scene MenuScene = new Scene(root);
currentStage.setScene(MenuScene); //use setScene() to switch the scene
currentStage.setTitle("PikaVolley");
currentStage.show();
}
}
【问题讨论】:
-
请解释一下您希望 tp 使用 AnimationTimer 实现什么?你期望它做什么?为什么在
VolleyController中构造和使用 AnimationTimer 与在Main中不同? -
@c0der 1.我想使用 AnimationTimer 来移动我的图像,而不是我当前的方法。 2.由于我是初学者,我无法区分。我所要做的就是查看命名约定?
-
分而治之。把一个复杂的问题分解成更小的问题,一次解决一个。请关注您的帖子一个问题是如何使用动画计时器定期移动图像?或者如何从 FXML 控制器更改场景?或者如何使用钥匙?任何帖子minimal reproducible example 都显示了这一点。
-
我已经重写了我的问题。希望它会更容易接受。
-
请注意 M 没有人愿意涉足大量不相关的代码。并坚持 Java 命名约定,现在!