Ball auf Panel hüpfen lassen

Status
Nicht offen für weitere Antworten.

Paddre

Mitglied
Hi
In Informatik haben wir ein einfaches programm geschrieben, welches einen Ball auf dem Fenster fallen lässt.
Das sieht dann quasi so aus, dass ein Ball gezeichnet wird, der als wenn schwerkraft herrschen würde mit einer bestimmten x-Richtung auf den "Boden" fällt uns hochfedert und denn immer kleinerre Sprünge macht... denk ma ihr könnts euch vorstellen...sieht halt ähnlich aus wie bei solitär wenn man gewonnen hat und die Karten runterfallen 😉

Das wollte ich auf ein eingerahmtes Panel verlagern mit weißem Hintergrund...der Optik wegen...aber irgendwie erscheint das Panel nicht. Ich deh nur das normale contentPane-Panel :-(

Code:
public class Frame1 extends JFrame {
    boolean sichtbar = false;
    int n,r=15,breite,hoehe;
    int[] x,y,vx,vy;
    JPanel contentPane;
    BorderLayout borderLayout1 = new BorderLayout();
    JPanel jPanel2 = new JPanel();
    public Frame1() {
        try {
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

 
    private void jbInit() throws Exception {
        breite = jPanel2.getWidth();
        hoehe = jPanel2.getHeight();
        x = new int [5];
        y = new int [5];
        vx = new int [5];
        vy = new int [5];
        for (n=1; n<2; n++) {
            x[n] = (int) Math.round(Math.random() * (breite - 50) + 25);
            y[n] = (int) Math.round(Math.random() * (hoehe - 50) + 25);
            vx[n] = (int) Math.round(Math.random() * 20 - 10);
            vy[n] = (int) Math.round(Math.random() * 20 - 10);
        }
        contentPane = (JPanel) getContentPane();
        contentPane.setLayout(borderLayout1);
        setSize(new Dimension(400, 300));
        setTitle("Frame-Titel");
        this.getContentPane().setLayout(null);
        jPanel2.setBackground(Color.white);
        jPanel2.setBorder(BorderFactory.createLineBorder(Color.black));
        jPanel2.setBounds(new Rectangle(6, 17, 387, 264));
        this.setResizable(false);
        Graphics g = jPanel2.getGraphics();
        paint(g);
    this.getContentPane().add(jPanel2);
    }

  //zeichnen
 
  public void paint(Graphics g)
    {
        int m,l;
        g.setColor(Color.red);
        g.setXORMode(Color.green);
        if (!sichtbar)
        {
            for(m=1; m<2; m++) {
                x[m] = x[m] + vx[m];
                y[m] = y[m] + vy[m];
                if (x[m] > breite - r - Math.abs(vx[m]) || (x[0] == x[1]) ||
                    (x[m] <= r + Math.abs(vx[m]))) vx[m] = -vx[m];

                if (y[m] > hoehe - r - Math.abs(vy[m]) || (y[0] == y[1]) ||
                    (y[m] <= r + Math.abs(vy[m]))) vy[m] = -vy[m];
                vy[m] = vy[m]+1;
                y[m] = y[m] + vy[m];
                g.fillOval(x[m] - r, y[m] - r, 2 * r, 2 * r);
            }
            pause(50);
            repaint(50);
            sichtbar=true;
        }
        else
        {

            for (l=1; l<2; l++) {
                g.fillOval(x[l] - r, y[l] - r, 2 * r, 2 * r);
                g.setColor(Color.black);
                g.fillOval(x[l] - r / 6, y[l] - r / 6, 2 * r / 6, 2 * r / 6);
            }
            repaint(50);
            sichtbar=false;
        }
    }

    public void update(Graphics g)
    {
        paint(g);
    }

    private void pause(int ms)
    {
        try
        {
            Thread.sleep(ms);
        }
        catch(InterruptedException e){}
    }
}
 
Ohne mal auf Fragen zu antworten, die nicht gestellt wurden: Wer hat euch .. "veranlaßt", das so zu schreiben? Also - hat euer Lehrer (oder so) gesagt, das wäre OK so?
 
das stand in sonem Tutorial zu bewegten Bildern...fast der ganze ode kommt daher

einziges waswir daran modifiziert haben is das mit den mehreren Bällen und der Schwerkrafteffekt...und die Spur die gezogen wird (Zeile 75-77 so wie ich das sehe...bin da noch nich so ganz drin in java 😉 )
 
Falls das "getGraphics" in dem Tutorial stand, dann schmeiß das Tutorial weg und schick dem Verfasser eine Briefbombe. Ansonsten ... in der paint-Methode sollte NUR gezeichnet werden. Außerdem ist es ratsam, nicht die paint-Methode des Frames zu überschreiben. Und wenn du es machst, solltest du am Anfang super.paint(g); aufrufen. Aber eigentlich sollte der Ball lieber von einem JPanel gezeichnet werden, dessen paintComponent-Methode geeignet überschrieben ist (d.h. dort wird dann als erstes super.paintComponent(g) aufgerufen). Hm. Im Moment wird eben der Event-Dispatch-Thread für etwas mißbraucht, was eigentlich von einem eigenen Thread gemacht werden sollte (nämlich die Bewegung des Balles zu regeln).

Ignorier' das:
Code:
import java.awt.*;
import javax.swing.*;

class Ball
{
    private Point pos;
    private Point vel;
    private Color color;

    public Ball(int mx, int my)
    {
        int x = (int)(Math.random()*mx);
        int y = (int)(Math.random()*my);
        pos = new Point(x,y);

        int vx = (int)(Math.random()*10);
        vel = new Point(vx, 0);

        int r = (int)(Math.random()*255);
        int g = (int)(Math.random()*255);
        int b = (int)(Math.random()*127);
        color = new Color(r,g,b);
    }

    public Color getColor()
    {
        return color;
    }

    public Point getPosition()
    {
        return pos;
    }

    public Point getVelocity()
    {
        return vel;
    }
}

class Balls implements Runnable
{
    private Ball balls[];
    private BallPanel ballPanel;

    public Balls(int number, BallPanel ballPanel)
    {
        this.ballPanel = ballPanel;
        balls = new Ball[number];
        for (int i=0; i<balls.length; i++)
        {
            balls[i] = new Ball(ballPanel.getWidth(), ballPanel.getHeight());
        }
    }

    public void run()
    {
        while (true)
        {
            for (int i=0; i<balls.length; i++)
            {
                Point pos = balls[i].getPosition();
                Point vel = balls[i].getVelocity();

                int newX = pos.x + vel.x;
                int newY = pos.y + vel.y;

                if (newY >= ballPanel.getHeight())
                {
                    newY = ballPanel.getHeight()-(newY-ballPanel.getHeight());
                    vel.y = -vel.y;
                }
                else if (newY <= 0)
                {
                    newY = -newY;
                    vel.y = -vel.y;
                }
                pos.y = newY;

                if (newX >= ballPanel.getWidth())
                {
                    newX = ballPanel.getWidth()-(newX-ballPanel.getWidth());
                    vel.x = -vel.x;
                }
                else if (newX <= 0)
                {
                    newX = -newX;
                    vel.x = -vel.x;
                }
                pos.x = newX;
                vel.y -= 1;
            }
            ballPanel.repaint();
            try
            {
                Thread.sleep(20);
            }
            catch (InterruptedException e)
            {
            }
        }
    }

    public int getNumBalls()
    {
        return balls.length;
    }

    public Ball getBall(int index)
    {
        return balls[index];
    }

}


class BallPanel extends JPanel
{
    private Balls balls;

    public void setBalls(Balls balls)
    {
        this.balls = balls;
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        if (balls == null)
        {
            return;
        }
        for (int i=0; i<balls.getNumBalls(); i++)
        {
            Ball b = balls.getBall(i);
            Point p = b.getPosition();
            Color c = b.getColor();
            g.setColor(c);
            g.fillOval(p.x, getHeight()-p.y, 20, 20);
        }
    }
}



class BallTest extends JFrame
{
    public static void main(String args[])
    {
        new BallTest();
    }

    public BallTest()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 600);

        BallPanel ballPanel = new BallPanel();

        getContentPane().setLayout(new GridLayout(1,1));
        getContentPane().add(ballPanel);

        setVisible(true);

        Balls balls = new Balls(25, ballPanel);
        ballPanel.setBalls(balls);
        new Thread(balls).start();
    }

}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben