Google 奔跑吧小恐龙
在Java中,可以使用JavaFX图形框架来实现游戏界面,使用多线程技术来实现游戏循环和动画效果。
以下是使用JavaFX和多线程实现奔跑吧小恐龙游戏的代码示例:
1.创建游戏面板并初始化游戏元素
public class GamePanel extends Pane {
private final RectangleBounds dino = new RectangleBounds(50, 150, 50, 50, Color.GREEN);
private final ObstacleManager obstacleManager = new ObstacleManager(this);
public GamePanel() {
setPrefSize(500, 300);
getChildren().addAll(dino, obstacleManager);
}
public void start() {
obstacleManager.start();
}
public void stop() {
obstacleManager.stop();
}
public RectangleBounds getDino() {
return dino;
}
}
2.使用多线程实现游戏循环和动画效果
public class GameLoop extends AnimationTimer {
private final GamePanel gamePanel;
private final Sprite dinoSprite;
private final ObstacleManager obstacleManager;
public GameLoop(GamePanel gamePanel, Sprite dinoSprite, ObstacleManager obstacleManager) {
this.gamePanel = gamePanel;
this.dinoSprite = dinoSprite;
this.obstacleManager = obstacleManager;
}
@Override
public void handle(long now) {
dinoSprite.update();
obstacleManager.update();
if (dinoSprite.intersect(obstacleManager.getObstacles())) {
stop();
gamePanel.stop();
}
}
}
3.创建障碍物管理器和障碍物对象
public class ObstacleManager extends Pane {
private final List<RectangleBounds> obstacles = new ArrayList<>();
private final Random random = new Random();
private final GamePanel gamePanel;
public ObstacleManager(GamePanel gamePanel) {
this.gamePanel = gamePanel;
}
public void start() {
getChildren().addAll(obstacles);
Timeline timeline = new Timeline(
new KeyFrame(Duration.seconds(1.5), event -> createObstacle())
);
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
}
public void stop() {
obstacles.clear();
getChildren().clear();
}
public List<RectangleBounds> getObstacles() {
return obstacles;
}
private RectangleBounds createObstacle() {
double size = random.nextDouble() * 40 + 30;
double height = gamePanel.getHeight() - size - gamePanel.getDino().getHeight() + 5;
RectangleBounds obstacle = new RectangleBounds(gamePanel.getWidth(), height, size, size, Color.BLUE);
obstacles.add(obstacle);
getChildren().add(obstacle);
return obstacle;
}
public void update() {
for (RectangleBounds obstacle : obstacles) {
obstacle.setTranslateX(obstacle.getTranslateX() - 5);
}
obstacles.removeIf(obstacle -> obstacle.getTranslateX() + obstacle.getWidth() < 0);
}
}
4.创建角色和障碍物对象,并用图形渲染显示
public class RectangleBounds extends Rectangle {
public RectangleBounds(double x, double y, double width, double height, Paint fill) {
super(x, y, width, height);
setFill(fill);
}
public boolean intersect(List<RectangleBounds> boundsList) {
for (RectangleBounds bounds : boundsList) {
if (bounds.getBoundsInParent().intersects(this.getBoundsInParent())) {
return true;
}
}
return false;
}
}
5.最后启动游戏
public class Game extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
GamePanel gamePanel = new GamePanel();
Scene scene = new Scene(gamePanel);
Sprite dinoSprite = new Sprite(gamePanel.getDino());
GameLoop gameLoop = new GameLoop(gamePanel, dinoSprite, gamePanel.getObstacleManager());
gameLoop.start();
gamePanel.start();
primaryStage.setScene(scene);
primaryStage.setTitle("Run Dino Run");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}