用javafx修改第七章的AlienDirection程序,不允许图像移出窗口的可视区域。忽略引起图像位置越界的键盘事件。
时间: 2024-03-23 19:40:29 浏览: 82
好的,以下是使用JavaFX修改的AlienDirection程序代码:
```java
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
public class AlienDirection extends Application {
private final int WIDTH = 600; // 窗口宽度
private final int HEIGHT = 400; // 窗口高度
private final int STEP = 10; // 图像每次移动的步长
private ImageView alienImage; // 外星人图像
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Alien Direction");
// 加载外星人图像
Image alien = new Image("alien.png");
alienImage = new ImageView(alien);
// 创建场景
Group root = new Group(alienImage);
Scene scene = new Scene(root, WIDTH, HEIGHT);
// 处理键盘事件
scene.setOnKeyPressed(event -> {
switch (event.getCode()) {
case UP:
moveUp();
break;
case DOWN:
moveDown();
break;
case LEFT:
moveLeft();
break;
case RIGHT:
moveRight();
break;
default:
break;
}
});
// 忽略引起图像位置越界的键盘事件
scene.setOnKeyReleased(event -> {});
// 创建动画循环
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
// 限制图像移动范围
double x = alienImage.getX();
double y = alienImage.getY();
if (x < 0) {
x = 0;
} else if (x > WIDTH - alienImage.getFitWidth()) {
x = WIDTH - alienImage.getFitWidth();
}
if (y < 0) {
y = 0;
} else if (y > HEIGHT - alienImage.getFitHeight()) {
y = HEIGHT - alienImage.getFitHeight();
}
alienImage.setX(x);
alienImage.setY(y);
}
};
timer.start();
primaryStage.setScene(scene);
primaryStage.show();
}
// 向上移动
private void moveUp() {
alienImage.setY(alienImage.getY() - STEP);
}
// 向下移动
private void moveDown() {
alienImage.setY(alienImage.getY() + STEP);
}
// 向左移动
private void moveLeft() {
alienImage.setX(alienImage.getX() - STEP);
}
// 向右移动
private void moveRight() {
alienImage.setX(alienImage.getX() + STEP);
}
public static void main(String[] args) {
launch(args);
}
}
```
与Pygame实现类似,我们也需要在键盘事件处理中限制图像移动范围。如果超出了窗口的可视区域,就将其移回到边界。这里我们使用了JavaFX的AnimationTimer来创建动画循环,每次循环时检查图像位置并进行边界限制。同时,我们也需要忽略那些引起图像位置越界的键盘事件,以避免图像移动出窗口的可视区域。
阅读全文