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