Rumah >Java >javaTutorial >Bagaimanakah saya boleh mencipta aplikasi Java yang memaparkan berbilang bola yang melantun tanpa bertindih?

Bagaimanakah saya boleh mencipta aplikasi Java yang memaparkan berbilang bola yang melantun tanpa bertindih?

Patricia Arquette
Patricia Arquetteasal
2024-12-16 02:35:14261semak imbas

How can I create a Java application that displays multiple bouncing balls without them overlapping?

Java Bouncing Ball

Dalam contoh ini, kami akan mencipta aplikasi Java yang melukis berbilang bola pada skrin yang melantun keluar dari tepi bingkai.

Masalah

Apabila cuba melukis berbilang bola, mereka akan menulis ganti antara satu sama lain kerana ia ditambahkan pada lokasi yang sama.

Penyelesaian

Untuk menyelesaikan isu ini, kita perlu:

  1. Buat Senarai Bola: Kami akan menggunakan ArrayList untuk menyimpan objek bola.
  2. Tambahkan Bola pada Kandungan Anak Tetingkap: Daripada menambah objek bola terus ke anak tetingkap kandungan, kami akan menambahkannya pada senarai.
  3. Bola Lukis: Kami akan mengulangi senarai dan melukis setiap bola di lokasi yang ditetapkan.
  4. Pergerakan Pegangan: Setiap bola akan mempunyai benang sendiri untuk mengendalikannya pergerakan, memastikan ia tidak menimpa satu sama lain.

Berikut ialah kod diubah suai yang melaksanakan perubahan ini:

import java.awt.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;

public class Ball extends JPanel implements Runnable {

    List<Ball> balls = new ArrayList<Ball>();
    Color color;
    int diameter;
    long delay;
    private int x;
    private int y;
    private int vx;
    private int vy;

    public Ball(String ballcolor, int xvelocity, int yvelocity) {
        if (ballcolor == "red") {
            color = Color.red;
        } else if (ballcolor == "blue") {
            color = Color.blue;
        } else if (ballcolor == "black") {
            color = Color.black;
        } else if (ballcolor == "cyan") {
            color = Color.cyan;
        } else if (ballcolor == "darkGray") {
            color = Color.darkGray;
        } else if (ballcolor == "gray") {
            color = Color.gray;
        } else if (ballcolor == "green") {
            color = Color.green;
        } else if (ballcolor == "yellow") {
            color = Color.yellow;
        } else if (ballcolor == "lightGray") {
            color = Color.lightGray;
        } else if (ballcolor == "magenta") {
            color = Color.magenta;
        } else if (ballcolor == "orange") {
            color = Color.orange;
        } else if (ballcolor == "pink") {
            color = Color.pink;
        } else if (ballcolor == "white") {
            color = Color.white;
        }
        diameter = 30;
        delay = 40;
        x = 1;
        y = 1;
        vx = xvelocity;
        vy = yvelocity;
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        for (Ball ball : balls) {
            ball.paint(g2);
        }
    }

    public void run() {
        while (isVisible()) {
            try {
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                System.out.println("interrupted");
            }
            move();
            repaint();
        }
    }

    public void move() {
        for (Ball ball : balls) {
            int newX = ball.x + ball.vx;
            int newY = ball.y + ball.vy;

            if(newX + ball.diameter > getWidth()) {
                ball.vx *= -1;
            }
            if(newY + ball.diameter > getHeight()) {
                ball.vy *= -1;
            }
            if(newX < 0) {
                ball.vx *= -1;
            }
            if(newY < 0) {
                ball.vy *= -1;
            }
            ball.x = newX;
            ball.y = newY;
        }
    }

    private void start() {
        while (!isVisible()) {
            try {
                Thread.sleep(25);
            } catch (InterruptedException e) {
                System.exit(1);
            }
        }
        Thread thread = new Thread(this);
        thread.setPriority(Thread.NORM_PRIORITY);
        thread.start();
    }

    public static void main(String[] args) {
        Ball ball1 = new Ball("red", 3, 2);
        Ball ball2 = new Ball("blue", 6, 2);
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(ball1);
        f.getContentPane().add(ball2);
        ball1.balls.add(ball1);
        ball2.balls.add(ball2);
        f.setSize(400,400);
        f.setLocation(200,200);
        f.setVisible(true);
        ball1.start();
        ball2.start();
    }
}

Dalam penyelesaian yang dikemas kini ini:

  • Kami mencipta objek Bola yang berasingan dan menambahkannya pada senarai.
  • Kami mengulangi senarai dalam paintKomponen untuk menarik semua bola.
  • Setiap bola mempunyai benang pergerakannya sendiri, menghalang timpa ganti.
  • Kami juga melaksanakan kaedah permulaan untuk memastikan benang bermula selepas bingkai kelihatan.

Dengan mengikuti langkah-langkah ini, kami boleh mencipta program yang berjaya menarik berbilang bola yang melantun pada skrin.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mencipta aplikasi Java yang memaparkan berbilang bola yang melantun tanpa bertindih?. 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