Heim  >  Artikel  >  Java  >  Fallstudie: Hüpfende Bälle

Fallstudie: Hüpfende Bälle

王林
王林Original
2024-07-16 22:12:01957Durchsuche

In diesem Abschnitt wird ein Programm vorgestellt, das springende Bälle anzeigt und es dem Benutzer ermöglicht, Bälle hinzuzufügen und zu entfernen.

Der Abschnitt stellt ein Programm vor, das einen springenden Ball anzeigt. In diesem Abschnitt wird ein Programm vorgestellt, das mehrere springende Bälle anzeigt. Sie können zwei Tasten verwenden, um die Bewegung der Bälle anzuhalten und fortzusetzen, eine Bildlaufleiste, um die Ballgeschwindigkeit zu steuern, und die +- oder --Taste, um einen Ball hinzuzufügen oder zu entfernen, wie in der Abbildung unten gezeigt.

Image description

Im Beispiel im Abschnitt musste nur ein Ball aufbewahrt werden. Wie lagert man in diesem Beispiel die mehreren Bälle? Die Methode getChildren() des Pane gibt eine ObservableList zurück, einen Untertyp von List, zum Speichern der Knoten im Bereich. Die Liste ist zunächst leer. Wenn ein neuer Ball erstellt wird, fügen Sie ihn am Ende der Liste hinzu. Um einen Ball zu entfernen, entfernen Sie einfach den letzten in der Liste.

Jeder Ball hat seinen Zustand: die X-, Y-Koordinaten, Farbe und Bewegungsrichtung. Sie können eine Klasse namens Ball definieren, die javafx.scene.shape.Circle erweitert. Die x-, y-Koordinaten und die Farbe sind bereits in Kreis definiert. Wenn ein Ball erzeugt wird, beginnt er in der oberen linken Ecke und bewegt sich nach unten nach rechts. Einem neuen Ball wird eine zufällige Farbe zugewiesen.

Die Klasse MultiplBallPane ist für die Anzeige des Balls verantwortlich und die Klasse MultipleBounceBall platziert die Steuerkomponenten und implementiert die Steuerung. Die Beziehung dieser Klassen ist in der folgenden Abbildung dargestellt. Der folgende Code gibt das Programm an.

Image description

package application;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.util.Duration;

public class MultipleBounceBall extends Application {
    @Override // Override the start method in the Application class
    public void start(Stage primaryStage) {
        MultipleBallPane ballPane = new MultipleBallPane();
        ballPane.setStyle("-fx-border-color: yellow");

        Button btAdd = new Button("+");
        Button btSubtract = new Button("-");
        HBox hBox = new HBox(10);
        hBox.getChildren().addAll(btAdd, btSubtract);
        hBox.setAlignment(Pos.CENTER);

        // Add or remove a ball
        btAdd.setOnAction(e -> ballPane.add());
        btSubtract.setOnAction(e -> ballPane.subtract());

        // Pause and resume animation
        ballPane.setOnMousePressed(e -> ballPane.pause());
        ballPane.setOnMouseReleased(e -> ballPane.play());

        // Use a scroll bar to control animation speed
        ScrollBar sbSpeed = new ScrollBar();
        sbSpeed.setMax(20);
        sbSpeed.setValue(10);
        ballPane.rateProperty().bind(sbSpeed.valueProperty());

        BorderPane pane = new BorderPane();
        pane.setCenter(ballPane);
        pane.setTop(sbSpeed);
        pane.setBottom(hBox);

        // Create a scene and place the pane in the stage
        Scene scene = new Scene(pane, 250, 150);
        primaryStage.setTitle("MultipleBounceBall"); // Set the stage title
        primaryStage.setScene(scene); // Place the scene in the stage
        primaryStage.show(); // Display the stage
    }

    public static void main(String[] args) {
        Application.launch(args);
    }

    private class MultipleBallPane extends Pane {
        private Timeline animation;

        public MultipleBallPane() {
            // Create an animation for moving the ball
            animation = new Timeline(new KeyFrame(Duration.millis(50), e -> moveBall()));
            animation.setCycleCount(Timeline.INDEFINITE);
            animation.play(); // Start animation
        }

        public void add() {
            Color color = new Color(Math.random(), Math.random(), Math.random(), 0.5);
            getChildren().add(new Ball(30, 30, 20, color));
        }

        public void subtract() {
            if(getChildren().size() > 0) {
                getChildren().remove(getChildren().size() - 1);
            }
        }

        public void play() {
            animation.play();
        }

        public void pause() {
            animation.pause();
        }

        public void increaseSpeed() {
            animation.setRate(animation.getRate() + 0.1);
        }

        public void decreaseSpeed() {
            animation.setRate(animation.getRate() > 0 ? animation.getRate() - 0.1 : 0);
        }

        public DoubleProperty rateProperty() {
            return animation.rateProperty();
        }

        protected void moveBall() {
            for(Node node: this.getChildren()) {
                Ball ball = (Ball)node;
                // Check boundaries
                if(ball.getCenterX() < ball.getRadius() || ball.getCenterX() > getWidth() - ball.getRadius()) {
                    ball.dx *= -1; // Change ball move direction
                }
                if(ball.getCenterY() < ball.getRadius() || ball.getCenterY() > getHeight() - ball.getRadius()) {
                    ball.dy *= -1; // Change ball move direction
                }

                // Adjust ball position
                ball.setCenterX(ball.dx + ball.getCenterX());
                ball.setCenterY(ball.dy + ball.getCenterY());
            }
        }
    }

    class Ball extends Circle {
        private double dx = 1, dy = 1;

        Ball(double x, double y, double radius, Color color) {
            super(x, y, radius);
            setFill(color); // Set ball color
        }
    }
}

Die Methode add() erstellt einen neuen Ball mit einer zufälligen Farbe und fügt ihn dem Bereich hinzu (Zeile 73). Der Bereich speichert alle Bälle in einer Liste. Die Methode subtract() entfernt den letzten Ball in der Liste (Zeile 78).

Wenn der Benutzer auf die Schaltfläche „+“ klickt, wird dem Bereich ein neuer Ball hinzugefügt (Zeile 32). Wenn der Benutzer auf die Schaltfläche „-“ klickt, wird der letzte Ball in der Array-Liste entfernt (Zeile 33).

Die Methode moveBall() in der Klasse MultipleBallPane ruft jeden Ball in der Liste des Bereichs ab und passt die Positionen der Bälle an (Zeilen 114–115).

Das obige ist der detaillierte Inhalt vonFallstudie: Hüpfende Bälle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:TasteNächster Artikel:Taste