Witam,
Otóż chciałem zacząć tworzyć jakąś prostą grę i mam problem z wyświetlaniem animacji. Na początek stworzyłem 2 klasy - jedną tworzącą okienko, drugą implementującą zachowania gracza i zaciąłem się na poruszaniem postaci.
W prosty sposób można poruszać postacią. Po prostu jest dodawany piksel przy każdym wciśnięciu klawisza strzałki. Jednak to mnie nie satysfakcjonuje, bo w momencie przytrzymania kursora, postać porusza się o piksel, po czym na chwilę przestaje się ruszać, i znowu rusza się (chodzi mi o opóźnienie klawiaturowe). Wyczytałem gdzieś, że warto stworzyć zmienną boolean, która daje true dla keyPressed i false dla keyReleased. W sumie to rozumiem, ale nie potrafię zaimplementować, bo teraz gdy wciskam strzałkę w prawo (bo właśnie na tym klawiszu chciałem wszystko wypróbować), program się na chwilę zatrzymuje i kulkę pokazuje dopiero w pozycji końcowej. Nie ma animacji...
Proszę o pomoc w tej sprawie, niżej wklejam moje klasy:
package gra;
import java.awt.event.*;
import javax.swing.*;
public class Main implements KeyListener {
int x = 450;
int y = 350;
Player gracz;
private boolean wcisniety = false;
public static void main(String[] args) {
Main gui = new Main();
gui.stworzramke();
}
private void stworzramke() {
JFrame ramka = new JFrame();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setSize(900, 700);
ramka.setVisible(true);
ramka.addKeyListener(this);
gracz = new Player();
ramka.getContentPane().add(gracz);
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
int klawisz = e.getKeyCode();
if (klawisz == KeyEvent.VK_RIGHT) {
wcisniety = true;
gracz.ruchWPrawo(wcisniety);
}
if (klawisz == KeyEvent.VK_LEFT) gracz.ruchWLewo();
if (klawisz == KeyEvent.VK_UP) gracz.ruchWGore();
if (klawisz == KeyEvent.VK_DOWN) gracz.ruchWDol();
gracz.repaint();
}
public void keyReleased(KeyEvent e) {
}
}
package gra;
import javax.swing.*;
import java.awt.*;
public class Player extends JPanel {
int x = 10;
int y = 10;
@Override
public void paintComponent(Graphics g) {
g.setColor(Color.yellow);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
//Image obrazek = new ImageIcon("images/player.png").getImage();
//g.drawImage(obrazek, x, y, this);
g.setColor(Color.green);
g.fillOval(x,y,40,40);
}
public void ruchWGore() {
y=y-5;
}
public void ruchWDol() {
y=y+5;
}
public void ruchWPrawo(boolean wcisniety) {
while ((wcisniety = true)&&(x < 500)) {
x++;
repaint();
try {
Thread.sleep(5);
} catch (Exception ex) { }
}
}
public void ruchWLewo() {
x=x-5;
}
}