Próbuję napisać taką grę: http://www.lemurlab.pl/pliki/strzelanie_do_balonow/gra.html . Chcę na razie zrobić prostą animację, która będzie przesuwać balon w prawo. Po umieszczeniu w mainie w nieskończonej pętli metody repaint() i opóźnienia o 50ms po uruchomieniu programu wyświetla się jedynie puste przezroczyste okienko. Przedtem wszystkie elementy wyświetlały się poprawnie. Czy ktoś mógłby mi z tym pomóc?
Klasa główna Balony2
package balony2;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
/**
* Klasa główna zawierająca main
*/
public class Balony2 extends Canvas implements Runnable {
/**
* @param args the command line argument
*/
private int x = 0;
private int y = 0;
private int size = 0;
Balony2() {}
public void run()
{ }
/**
* Metoda tworząca obiekt klasy Okno i wyświetlająca dane o grze
*/
public static void main(String[] args) throws Exception {
/**
* Utworzenie obiektu klasy Okno
*/
EventQueue.invokeLater(new Runnable() {
public void run()
{
final Okno o;
o = new Okno();
o.setLocationRelativeTo(null);
o.setVisible(true);
while(true)
{
o.PanelGry.repaint();
try {
Thread.sleep(50);
} catch (InterruptedException ie) {
}
}
}
});
}
}
Klasa Okno
package balony2;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
* Klasa wyświetlająca okno gry
*/
public class Okno extends JFrame implements ActionListener {
public OknoRysowania PanelGry;
public JPanel PanelBoczny;
private JButton Button1;
private JButton Button2;
private JButton Button3;
//JFrame frame = new JFrame();
/**
* Konstruktor klasy Okno
*/
public Okno()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CzytanieZPliku a = new CzytanieZPliku();
setTitle("Balony");
PanelBoczny = new JPanel(new GridLayout(10,0));
Button1 = new JButton("Start");
Button1.addActionListener(this);
Button2 = new JButton("Pause");
Button2.addActionListener(this);
Button3 = new JButton("Wyjscie");
Button3.addActionListener(this);
PanelBoczny.add(Button1);
PanelBoczny.add(Button2);
PanelBoczny.add(Button3);
PanelGry = new OknoRysowania(this);
JPanel PanelAll = new JPanel();
PanelAll.setLayout(new BorderLayout());
PanelAll.add(PanelGry, BorderLayout.CENTER);
PanelAll.add(PanelBoczny, BorderLayout.WEST);
PanelBoczny.setPreferredSize(new Dimension(100,a.zwrocWysokoscOkna()));
PanelGry.setPreferredSize(new Dimension(a.zwrocSzerokoscOkna(),a.zwrocWysokoscOkna()));
PanelBoczny.setBackground(Color.LIGHT_GRAY);
PanelGry.setBackground(Color.PINK);
add(PanelAll);
pack();
}
/**
* Metoda obsługująca akcje przycisków panelu bocznego
*/
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if(source==Button1){
System.out.println("Start");
}
else if(source==Button2){
}
else if(source==Button3){
dispose();
}
}
}
Klasa Oknorysowania
package balony2;
import java.awt.Graphics;
import java.awt.event.ComponentAdapter;
import javax.swing.JPanel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
/**
* Klasa OknoRysowania rysująca elementy planszy
*/
public class OknoRysowania extends JPanel implements MouseListener,MouseMotionListener, Runnable {
private float wsp_szer;
private float wsp_wys;
public Okno gf;
private int mouseX;
private int mouseY;
public Balonik Ruchomy;
public double x, y;
public boolean move;
/**
* Konstruktor klasy OknoRysowania
*/
public OknoRysowania(Okno gf) {
addMouseListener(this);
addMouseMotionListener(this);
this.gf = gf;
for (int i = 0; i < 14; i++)
{
for (int k = 0; k < 5; k++){tab[i][k] = new Balonik();}
}
Ruchomy = new Balonik();
x = 7*30;
y = 14*30;
this.addComponentListener(new ComponentAdapter() {
});
}
/**
* Utworzenie tablicy obiektów klasy Balonik
*/
Balonik[][] tab = new Balonik[15][15];
CzytanieZPliku b = new CzytanieZPliku();
int szerpocz = b.zwrocSzerokoscOkna();
int wyspocz = b.zwrocWysokoscOkna();
float mSzer()
{
int szer = getWidth();
wsp_szer = (float)szer/(float)szerpocz;
return wsp_szer;
};
float mWys()
{
int wys = getHeight();
wsp_wys = (float)wys/(float)wyspocz;
return wsp_wys;
};
/**
* Metoda rysująca obiekty na planszy
*/
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
int szer = getWidth();
int wys = getHeight();
wsp_szer = (float)szer/(float)szerpocz;
wsp_wys = (float)wys/(float)wyspocz;
System.out.println(wsp_szer);
g.setColor(Ruchomy.zwrocKolor());
System.out.println("x " + x);
g.fillOval((int)(x*wsp_wys),(int)(14*30*wsp_wys),(int)(30*wsp_szer),(int)(30*wsp_wys));
for(int i=0; i<14; i++)
{
for(int k=0; k<4; k++)
{
if ( (k % 2) == 0){
g.setColor(tab[i][k].zwrocKolor());
g.fillOval((int)(i*30*wsp_szer),(int)(k*30*wsp_wys),(int)(30*wsp_szer),(int)(30*wsp_wys));
}
else {
g.setColor(tab[i][k].zwrocKolor());
g.fillOval((int)(i*30*wsp_szer)+(int)(15*wsp_szer),(int)(k*30*wsp_wys),(int)(30*wsp_szer),(int)(30*wsp_wys));
}
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("mouseClicked");
System.out.println(mouseX);
System.out.println(mouseY);
}
public void run()
{
}
@Override
public void mousePressed(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
for(int i=0; i<100; i++)
{
x = x+1;
move = true;
}
}
@Override
public void mouseReleased(MouseEvent e) { }
@Override
public void mouseEntered(MouseEvent e) { }
@Override
public void mouseExited(MouseEvent e) { }
@Override
public void mouseDragged(MouseEvent e) { }
@Override
public void mouseMoved(MouseEvent e) { }
}
Klasa Balonik
package balony2;
import java.util.Random;
import java.awt.Color;
/**
* Klasa Balonik
*/
public class Balonik {
/**
* Konstruktor domyślny obiektu klasy blonik
*/
public Balonik () {}
/**
* Metoda losująca kolor objektu balonik
*/
public Color losujKolor()
{
Color kolory[] = {Color.BLACK, Color.BLUE, Color.RED, Color.GREEN, Color.ORANGE};
Color losowy = kolory[liczbaKolor()];
return losowy;
}
/**
* Metoda losująca libcze odpowiadającą kolorowi balonu
*/
public int liczbaKolor()
{
Random generator = new Random();
int m = generator.nextInt(5);
return m;
}
/**
* Deklaracja metod w klasie balonik
*/
Color kolorek = losujKolor();
Color zwrocKolor(){return kolorek;}
}