Animacja w Javie cd.

0

Otwieram temat na nowo. Próbuję teraz zrobić animację kulki w taki sposób, żeby kulka latała po całym ekranie i odbijała się od jego brzegów. Jednak mój kod daje wiele do życzenia i kulka się wiesza. Daję kod:

import java.awt.Color;
import java.awt.Component;
import java.awt.DisplayMode;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Animacja extends JFrame implements KeyListener
{
    public class AnimacjaPanel extends JPanel
    {
        int x, y;
        int xEkranu, yEkranu;
        double angle;
        boolean init = false;
        int b;

        public void ustawEkran()
        {
            xEkranu = Toolkit.getDefaultToolkit().getScreenSize().width;
            yEkranu = Toolkit.getDefaultToolkit().getScreenSize().height;
        }

        public void resetujWspolrzedne()
        {
            x = xEkranu / 2;
            y = yEkranu - 10;
        }

        public void ustawKat()
        {
            angle = (new Random()).nextInt(180) * 3.14 / 180;
        }

        public void ustawB(boolean f)
        {
            if (f)
                b = y - (int)(Math.tan(angle)) * x;

            else
                b = (new Random()).nextInt() % 200;
        }

        public void przesun()
        {
            x = (int)((y - b)/ Math.tan(angle));
            y = (int)(Math.tan(angle) * x) + b;
        }

        public boolean wykryjKolizje()
        {
            if (x >= xEkranu - 1 || x <= 0 || y >= yEkranu - 1 || y <= 0)
                return true;

            return false;
        }

        public void wybij()
        {
            if (x <= 0)
                x += 10;

            else if (x >= xEkranu)
                x -= 10;

            if (y <= 0)
                y += 10;

            else if (y >= yEkranu)
                y -= 10;
        }

        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.setColor(Color.black);
            g.fillOval(x, y, 10, 10);
            System.out.println(x + " " + y + " " + angle + " " + b);

            if (!init)
            {
                ustawEkran();
                resetujWspolrzedne();
                ustawKat();
                ustawB(false);
                init = true;
            }

            przesun();

            if (wykryjKolizje())
            {
                ustawKat();
                ustawB(true);
                wybij();
            }
        }
    }

    public Animacja()
    {
        setBounds(0, 0, 600, 600);

        AnimacjaPanel p = new AnimacjaPanel();
        add(p);

        addKeyListener(this);
        requestFocus();

        setUndecorated(true);
        setResizable(false);
        przelaczNaPelnyEkran(true);

        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        new Watek(p);
    }

    public static void main(String[] args) {
        new Animacja();
    }

    @Override
    public void keyPressed(KeyEvent ke) {
        int code = ke.getKeyCode();

        if (code == KeyEvent.VK_ESCAPE)
            System.exit(0);
    }

    @Override
    public void keyReleased(KeyEvent ke) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent ke) {
        // TODO Auto-generated method stub

    }

    public void przelaczNaPelnyEkran(boolean flaga)
    {
        DisplayMode displayMode = new DisplayMode(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height, 24, 75);
        GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice device = environment.getDefaultScreenDevice();
        device.setFullScreenWindow(this);

        try {
        if (flaga)
            device.setDisplayMode(displayMode);

        else
            device.setDisplayMode(null);
        } catch (IllegalArgumentException e)
        {
            System.out.println("Wyjątek!");
        }
    }
}
import java.awt.Component;

public class Watek implements Runnable
{
        private final Component c;

        public Watek(Component c)
        {
            this.c = c;
            (new Thread(this, "F")).start();
        }

        @Override
        public void run() {
            while (true)
            {
                c.repaint();

                try {
                    Thread.sleep(5);
                } catch (Exception e)
                {
                    System.out.println("Wyjątek!");
                }
            }

        }
}

Aby wyłączyć program wystarczy wcisnąć ESC.

0

Już sobie poradziłem:

Zamieniłem równanie ruchu z y = ax + b na:
x += V0 sin(alfa)
y += V0
cos(alfa)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0