用javafx修改第七章的AlienDirection程序,不允许图像移出窗口的可视区域。忽略引起图像位置越界的键盘事件。
时间: 2024-03-24 12:41:05 浏览: 14
好的,以下是使用JavaFX修改后的程序:
```java
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class AlienDirection extends Application {
private static final int WIDTH = 500;
private static final int HEIGHT = 500;
private static final int SPEED = 5;
@Override
public void start(Stage primaryStage) throws Exception {
// 加载图像
Image alienImage = new Image("alien.png");
ImageView alien = new ImageView(alienImage);
// 设置初始位置
alien.setX(WIDTH / 2 - alienImage.getWidth() / 2);
alien.setY(HEIGHT / 2 - alienImage.getHeight() / 2);
// 创建场景和舞台
Pane root = new Pane(alien);
Scene scene = new Scene(root, WIDTH, HEIGHT);
primaryStage.setScene(scene);
primaryStage.setTitle("Alien Direction");
// 监听键盘事件
boolean leftKeyPressed = false;
boolean rightKeyPressed = false;
boolean upKeyPressed = false;
boolean downKeyPressed = false;
scene.setOnKeyPressed(event -> {
if (event.getCode() == KeyCode.LEFT) {
leftKeyPressed = true;
} else if (event.getCode() == KeyCode.RIGHT) {
rightKeyPressed = true;
} else if (event.getCode() == KeyCode.UP) {
upKeyPressed = true;
} else if (event.getCode() == KeyCode.DOWN) {
downKeyPressed = true;
}
});
scene.setOnKeyReleased(event -> {
if (event.getCode() == KeyCode.LEFT) {
leftKeyPressed = false;
} else if (event.getCode() == KeyCode.RIGHT) {
rightKeyPressed = false;
} else if (event.getCode() == KeyCode.UP) {
upKeyPressed = false;
} else if (event.getCode() == KeyCode.DOWN) {
downKeyPressed = false;
}
});
// 创建动画循环,每帧检查键盘事件和越界情况
AnimationTimer animationTimer = new AnimationTimer() {
@Override
public void handle(long now) {
if (leftKeyPressed) {
alien.setX(alien.getX() - SPEED);
}
if (rightKeyPressed) {
alien.setX(alien.getX() + SPEED);
}
if (upKeyPressed) {
alien.setY(alien.getY() - SPEED);
}
if (downKeyPressed) {
alien.setY(alien.getY() + SPEED);
}
// 检查是否越界
if (alien.getX() < 0) {
alien.setX(0);
} else if (alien.getX() + alienImage.getWidth() > WIDTH) {
alien.setX(WIDTH - alienImage.getWidth());
}
if (alien.getY() < 0) {
alien.setY(0);
} else if (alien.getY() + alienImage.getHeight() > HEIGHT) {
alien.setY(HEIGHT - alienImage.getHeight());
}
}
};
animationTimer.start();
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
```
修改后的程序中,我们使用JavaFX的ImageView来显示图像,并且监听键盘事件来更新图像的位置。在检查是否越界时,我们使用了JavaFX的Rectangle2D类来判断图像是否超出窗口的可视区域。如果超出了,就将图像位置限制在可视区域内。这样就可以避免图像位置越界的情况了。