Maison  >  Article  >  Java  >  Étude de cas : balles rebondissantes

Étude de cas : balles rebondissantes

王林
王林original
2024-07-16 22:12:01958parcourir

Cette section présente un programme qui affiche les balles rebondissantes et permet à l'utilisateur d'ajouter et de supprimer des balles.

La section présente un programme qui affiche une balle rebondissante. Cette section présente un programme qui affiche plusieurs balles rebondissantes. Vous pouvez utiliser deux boutons pour suspendre et reprendre le mouvement des balles, une barre de défilement pour contrôler la vitesse de la balle et le bouton + ou - pour ajouter ou supprimer une balle, comme le montre la figure ci-dessous.

Image description

L'exemple de la section ne devait stocker qu'une seule balle. Comment stockez-vous les multiples balles dans cet exemple ? La méthode getChildren() du Pane renvoie une ObservableList, un sous-type de List, pour stocker les nœuds dans le volet. Au départ, la liste est vide. Lorsqu'une nouvelle balle est créée, ajoutez-la à la fin de la liste. Pour supprimer une balle, supprimez simplement la dernière de la liste.

Chaque balle a son état : les coordonnées x, y, la couleur et la direction dans laquelle se déplacer. Vous pouvez définir une classe nommée Ball qui étend javafx.scene.shape.Circle. Les coordonnées x, y et la couleur sont déjà définies dans Cercle. Lorsqu'une balle est créée, elle part du coin supérieur gauche et se déplace vers le bas vers la droite. Une couleur aléatoire est attribuée à une nouvelle balle.

La classe MultiplBallPane est responsable de l'affichage de la balle et la classe MultipleBounceBall place les composants de contrôle et implémente le contrôle. La relation entre ces classes est illustrée dans la figure ci-dessous. Le code ci-dessous donne le programme.

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
        }
    }
}

La méthode add() crée une nouvelle boule avec une couleur aléatoire et l'ajoute au volet (ligne 73). Le volet stocke toutes les boules dans une liste. La méthode subtract() supprime la dernière balle de la liste (ligne 78).

Lorsque l'utilisateur clique sur le bouton +, une nouvelle boule est ajoutée au volet (ligne 32). Lorsque l'utilisateur clique sur le bouton -, la dernière boule de la liste des tableaux est supprimée (ligne 33).

La méthode moveBall() de la classe MultipleBallPane récupère chaque balle de la liste du volet et ajuste les positions des balles (lignes 114-115).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:BoutonArticle suivant:Bouton