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.