>Java >java지도 시간 >사례 연구: 튀는 공

사례 연구: 튀는 공

王林
王林원래의
2024-07-16 22:12:01998검색

튀는 공을 표시하고 사용자가 공을 추가하고 제거할 수 있는 프로그램을 소개합니다.

섹션에서는 튀는 공 하나를 표시하는 프로그램을 제공합니다. 이 섹션에서는 여러 개의 튀는 공을 표시하는 프로그램을 제공합니다. 아래 그림과 같이 두 개의 버튼을 사용하여 공의 이동을 일시 중지 및 재개하고 스크롤 막대를 사용하여 공 속도를 제어할 수 있으며 + 또는 - 버튼을 사용하여 공을 추가하거나 제거할 수 있습니다.

Image description

섹션의 예에서는 공 하나만 저장해야 했습니다. 이 예에서는 여러 개의 공을 어떻게 저장합니까? PanegetChildren() 메소드는 페인에 노드를 저장하기 위해 List의 하위 유형인 ObservableList를 반환합니다. 처음에는 목록이 비어 있습니다. 새로운 공이 생성되면 목록 끝에 추가하세요. 공을 제거하려면 목록에서 마지막 공을 제거하면 됩니다.

각 공에는 x, y 좌표, 색상, 이동 방향 등의 상태가 있습니다. javafx.scene.shape.Circle을 확장하는 Ball이라는 클래스를 정의할 수 있습니다. x, y 좌표와 색상은 에 이미 정의되어 있습니다. 공이 생성되면 왼쪽 상단에서 시작하여 오른쪽 아래로 이동합니다. 새로운 공에 임의의 색상이 지정됩니다.

MultiplBallPane 클래스는 공을 표시하는 역할을 하며 MultipleBounceBall 클래스는 컨트롤 구성 요소를 배치하고 컨트롤을 구현합니다. 이러한 클래스의 관계는 아래 그림에 나와 있습니다. 아래 코드는 프로그램을 제공합니다.

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

add() 메소드는 임의의 색상으로 새 공을 생성하여 창에 추가합니다(73행). 창은 모든 공을 목록에 저장합니다. subtract() 메소드는 목록(78행)의 마지막 공을 제거합니다.

사용자가 + 버튼을 클릭하면 새 공이 창에 추가됩니다(32행). 사용자가 - 버튼을 클릭하면 배열 목록의 마지막 공이 제거됩니다(33행).

MultipleBallPane 클래스의 moveBall() 메서드는 창 목록의 모든 공을 가져와서 공의 위치를 ​​조정합니다(114~115행).

위 내용은 사례 연구: 튀는 공의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:단추다음 기사:단추