Rumah  >  Artikel  >  Java  >  Kajian Kes: Bola Melantun

Kajian Kes: Bola Melantun

王林
王林asal
2024-07-16 22:12:01958semak imbas

Bahagian ini membentangkan program yang memaparkan bola yang melantun dan membolehkan pengguna menambah dan mengeluarkan bola.

Bahagian membentangkan program yang memaparkan satu bola yang melantun. Bahagian ini membentangkan program yang memaparkan berbilang bola melantun. Anda boleh menggunakan dua butang untuk menggantung dan menyambung semula pergerakan bola, bar skrol untuk mengawal kelajuan bola dan butang + atau - menambah atau mengeluarkan bola, seperti ditunjukkan dalam Rajah di bawah.

Image description

Contoh dalam Bahagian hanya perlu menyimpan satu bola. Bagaimanakah anda menyimpan berbilang bola dalam contoh ini? Kaedah Pane's getChildren() mengembalikan ObservableList, subjenis List, untuk menyimpan nod dalam anak tetingkap. Pada mulanya, senarai itu kosong. Apabila bola baharu dibuat, tambahkannya pada penghujung senarai. Untuk mengeluarkan bola, cuma alih keluar bola terakhir dalam senarai.

Setiap bola mempunyai keadaannya: koordinat x-, y, warna dan arah untuk bergerak. Anda boleh menentukan kelas bernama Bola yang memanjangkan javafx.scene.shape.Circle. Koordinat x-, y dan warna sudah ditakrifkan dalam Bulatan. Apabila bola dicipta, ia bermula dari sudut kiri atas dan bergerak ke bawah ke kanan. Warna rawak diberikan kepada bola baharu.

Kelas MultiplBallPane bertanggungjawab untuk memaparkan bola dan kelas MultipleBounceBall meletakkan komponen kawalan dan melaksanakan kawalan. Hubungan kelas-kelas ini ditunjukkan dalam Rajah di bawah. Kod di bawah memberikan program.

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

Kaedah add() mencipta bola baharu dengan warna rawak dan menambahkannya pada anak tetingkap (baris 73). Anak tetingkap menyimpan semua bola dalam senarai. Kaedah tolak() mengalih keluar bola terakhir dalam senarai (baris 78).

Apabila pengguna mengklik butang +, bola baharu ditambahkan pada anak tetingkap (baris 32). Apabila pengguna mengklik butang -, bola terakhir dalam senarai tatasusunan dialih keluar (baris 33).

Kaedah moveBall() dalam kelas MultipleBallPane mendapatkan setiap bola dalam senarai anak tetingkap dan melaraskan kedudukan bola (baris 114–115).

Atas ialah kandungan terperinci Kajian Kes: Bola Melantun. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:ButangArtikel seterusnya:Butang