Java Bouncing Ball


Answers

Sie müssen hier zwei völlig verschiedene Klassen verwenden - eine für BallContainer, die JPanel erweitert und die Komponente ist, die die Bälle zieht, und eine andere für Ball, die nichts verlängert, sondern die Koordinaten und die Farbe eines Balles hält. BallContainer sollte eine List<Ball> hodlieren, die sie durchläuft, wenn sie sie bewegt und wann sie sie malt.

Question

Ich versuche, eine Java-Anwendung zu schreiben, die mehrere Bälle auf dem Bildschirm zeichnet, die von den Rändern des Rahmens abprallen. Ich kann erfolgreich einen Ball ziehen. Doch wenn ich den zweiten Ball hinzufüge, überschreibt er den anfänglichen Ball, den ich gezeichnet habe. Der Code ist:

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;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setColor(color);
    g.fillOval(x,y,30,30); //adds color to circle
    g.setColor(Color.black);
    g2.drawOval(x,y,30,30); //draws circle
}

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

public void move() {
    if(x + vx < 0 || x + diameter + vx > getWidth()) {
        vx *= -1;
    }
    if(y + vy < 0 || y + diameter + vy > getHeight()) {
        vy *= -1;
    }
    x += vx;
    y += vy;
}

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);
    f.setSize(400,400);
    f.setLocation(200,200);
    f.setVisible(true);
    new Thread(ball1).start();
    new Thread(ball2).start();
}
}

Ich wollte eine Liste von Bällen erstellen und dann durch das Zeichnen jeder der Bälle radeln, aber ich habe immer noch Schwierigkeiten beim Hinzufügen von beiden Bällen zum Content Pane.

Danke für jede Hilfe.




package BouncingBallApp.src.copy;
import java.awt.*;


public class Ball {
    private Point location;
    private int radius;
    private Color color;
    private int dx, dy;
    //private Color[] ballArr;

    public Ball(Point l, int r, Color c){
        location = l;
        radius = r;
        color = c;
    }

    public Ball(Point l, int r){
        location = l;
        radius = r;
        color = Color.RED;

    }

    public Point getLocation() {
        return location;
    }

    public void setLocation(Point location) {
        this.location = location;
    }

    public int getRadius() {
        return radius;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }

    public Color getColor() {
        return color;
    }

    public void setColor(Color color) {
        this.color = color;

    }

    public void setMotion(int dx, int dy){
        this.dx = dx;
        this.dy = dy;
    }

    public void move(){
        location.translate(dx, dy);
    }

    public void moveTo(int x, int y){
        location.move(x, y);
    }

    public void paint (Graphics g) {
        g.setColor (color);
        g.fillOval (location.x-radius, location.y-radius, 2*radius, 2*radius);
    }

    public void reclectHoriz() {
        dy = -dy;       
    }   

    public void reclectVert() {
        dx = -dx;       
    }
}







package BouncingBallApp.src.copy;

public class MyApp {

    public static void main(String[] args) {
        MyFrame frm = new MyFrame(10);
        frm.setVisible(true);           

        for (int i=0; i<1000; i++){
            frm.stepTheBall();
        }
    }
}





package BouncingBallApp.src.copy;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.Random;

import javax.swing.JFrame;


public class MyFrame extends JFrame {
    public final int FRAMEWIDTH = 600;
    public final int FRAMEHEIGHT = 400;

    private Ball[] ballArr;

    private Random random =new Random ();
    private Color[] colors={Color.RED,Color.blue,Color.yellow}; 
    private int ballCnt;

    public MyFrame(int ballCnt){
        super();
        setSize(FRAMEWIDTH, FRAMEHEIGHT);
        setTitle("My Bouncing Ball Application");

        ballArr = new Ball[ballCnt];
        this.ballCnt = ballCnt;
         int c;

        for (int i=0; i < ballCnt; i++){
            int bcn =random.nextInt(colors.length);
            Color ballcolor=colors[bcn];
            ballArr[i] = new Ball(new Point(50,50),c=(int) (Math.random()*10+3)%8,ballcolor);


            int ddx = (int) (Math.random()*10+2)%8;
            int ddy = (int) (Math.random()*10+2)%8;         
            ballArr[i].setMotion(ddx, ddy); 
            //c++;
        }
    }

    public void paint(Graphics g){
        super.paint(g);
        for (int i=0; i < ballCnt; i++){
            ballArr[i].paint(g);    
        }
    }

    public void stepTheBall(){
        for (int i=0; i < ballCnt; i++){        
            ballArr[i].move();

            Point loc = ballArr[i].getLocation();

            if (loc.x < ballArr[i].getRadius() ||
                loc.x > FRAMEWIDTH-ballArr[i].getRadius()){
                ballArr[i].reclectVert();
            }

            if (loc.y < ballArr[i].getRadius() ||
                    loc.y > FRAMEHEIGHT-ballArr[i].getRadius()){
                ballArr[i].reclectHoriz();
            }
        }   
        repaint();
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}