我是初学者。我正在制作一个简单的2D游戏。我有以下JavaFx游戏应用程序...我想通过单击另一个gui类的“新建游戏”按钮来启动游戏。我怎样才能做到这一点?我应该调用启动方法还是什么?我想点击“新游戏”按钮来运行我的游戏
我的代码:
public class ColorRun extends Application {
private static final double KEYBOARD_MOVEMENT_DELTA = 5;
private static final double RECT_WIDTH = 200;
private static final double RECT_HEIGHT = 70;
private static final double RECT_MAX_Y = 800;
private static Rectangle createRectangle(double x) {
Rectangle rect = new Rectangle(x, 0, RECT_WIDTH, RECT_HEIGHT);
rect.setStroke(Color.BLACK);
rect.setArcWidth(10);
rect.setArcHeight(10);
return rect;
}
private final Random random = new Random();
private void randomizeColors(Rectangle[] rects, Circle circle, List<Color> colors) {
Collections.shuffle(colors, random);
for (int i = 0; i < rects.length; i++) {
rects[i].setFill(colors.get(i));
}
circle.setFill(colors.get(random.nextInt(colors.size())));
}
@Override
public void start(Stage primaryStage) {
List<Color> colors = Arrays.asList(Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW, Color.GREY);
Circle circle = new Circle(650, 700, 20);
Rectangle[] rectangles = new Rectangle[5];
for (int i = 0; i < rectangles.length; i++) {
rectangles[i] = createRectangle(RECT_WIDTH * i);
}
Pane root = new Pane();
root.setPrefHeight(RECT_MAX_Y);
for (Rectangle rect : rectangles) {
root.getChildren().add(rect);
}
root.getChildren().add(circle);
final double frameDuration = 16;
final double iterationDuration = 4000;
final int framesPerIteration = (int) (iterationDuration / frameDuration + 1);
randomizeColors(rectangles, circle, colors);
Timeline timeline = new Timeline();
class FrameHandler implements EventHandler<ActionEvent> {
KeyCode code;
private int frame = 1;
@Override
public void handle(ActionEvent event) {
if (frame == 0) {
randomizeColors(rectangles, circle, colors); // change colors when iteration is done
}
// move circle, if key is pressed
if (code != null) {
switch (code) {
case RIGHT:
circle.setCenterX(circle.getCenterX() + KEYBOARD_MOVEMENT_DELTA);
break;
case LEFT:
circle.setCenterX(circle.getCenterX() - KEYBOARD_MOVEMENT_DELTA);
break;
}
}
// move rects & check intersection
final Paint color = circle.getFill();
final double cx = circle.getCenterX();
final double cy = circle.getCenterY();
final double r2 = circle.getRadius() * circle.getRadius();
boolean lost = false;
for (Rectangle rect : rectangles) {
rect.setY(frame * RECT_MAX_Y / framesPerIteration);
// check for intersections with rects of wrong color
if (rect.getFill() != color) {
double dy = Math.min(Math.abs(rect.getY() - cy),
Math.abs(rect.getY() + rect.getHeight() - cy));
dy = dy * dy;
if (dy > r2) {
continue; // y-distance too great for intersection
}
if (cx >= rect.getX() && cx <= rect.getX() + rect.getWidth()) {
lost = true;
} else {
double dx = Math.min(Math.abs(rect.getX() - cx),
Math.abs(rect.getX() + rect.getWidth() - cx));
if (dx * dx + dy <= r2) {
lost = true;
}
}
}
}
frame = (frame + 1) % framesPerIteration;
if (lost) {
timeline.stop();
}
}
}
FrameHandler frameHandler = new FrameHandler();
Scene scene = new Scene(root);
// keep track of the state of the arrow keys
scene.setOnKeyPressed(evt -> {
KeyCode code = evt.getCode();
switch (code) {
case RIGHT:
case LEFT:
frameHandler.code = code;
break;
}
});
scene.setOnKeyReleased(evt -> {
KeyCode code = evt.getCode();
if (frameHandler.code == code) {
frameHandler.code = null;
}
});
primaryStage.setScene(scene);
timeline.getKeyFrames()
.add(new KeyFrame(Duration.millis(frameDuration), frameHandler));
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}