Java의 repaint() 메소드에 문제가 있습니다. 나는 끊임없이 화면을 다시 칠하는 새로운 실을 만들었다. 스페이스 바를 놓을 때 위치를 설정하고 50 밀리 초를 기다리며 20 번 반복하면서 플레이어가 원활하게 떨어지길 원합니다. 대신, 루프의 전체 시간을 기다리는 다음 다시 칠합니다. 나는 왜 그것이 플레이어 코디네이트의 변화를 끊임없이 다시 그리지 않는지 궁금하다. 고맙습니다.Java repaint() 메소드가 항상 작동하지 않는 경우
(편집) 도움을 주신 모든 분들께 감사드립니다. 이것은 스택 오버플로를 사용하는 첫 번째 시간이며, 나는 단지 13 일 뿐이고 여전히 자바를 배우기 때문에 다시 자습서로 돌아갈 것입니다.
내 'A'클래스 (주) :
public class a {
public static void main(String[] args) {
JFrame frame = new JFrame("StickFigure Game");
frame.setSize(740, 580);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
b board = new b();
frame.add(board);
frame.addKeyListener(board);
}
}
내 'B'클래스 (JPanel의/그림) :
public class b extends JPanel implements KeyListener {
c player = new c();
public class MyRunnable implements Runnable {
public void run() {
while (true)
repaint();
}
}
MyRunnable run = new MyRunnable();
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(player.getImage(), player.getX(), player.getY(), 80, 140,
null);
}
public b() {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
public static void slow(int n) {
long t0, t1;
t0 = System.currentTimeMillis();
do {
t1 = System.currentTimeMillis();
} while (t1 - t0 < n);
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_D) {
player.setPos(player.getX() + 6, player.getY());
}
if (e.getKeyCode() == KeyEvent.VK_A) {
player.setPos(player.getX() - 6, player.getY());
}
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
player.setPos(player.getX(), player.getY() - 60);
}
}
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
for (int i = 0; i < 20; i++) {
slow(50);
player.setPos(player.getX(), player.getY() + 2);
}
}
}
public void keyTyped(KeyEvent e) {
}
}
내 'C'클래스 (선수) :
public class c {
private ImageIcon i = new ImageIcon("guy.png");
private Image img = i.getImage();
private int x = 0;
private int y = 100;
public void wait(int what) {
try {
Thread.sleep(what);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public c() {
}
public Image getImage() {
return img;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setPos(int mx, int my) {
x = mx;
y = my;
}
}
죄송합니다. 이 코드는 읽기가 정말 어렵습니다. 절대적으로 필요한 것만 잘라 주실 수 있습니까? 방금 코드 벽으로 우리를 때렸습니다. – christopher
코드를 읽으려면 코드 형식을 올바르게 지정해야합니다. 몇 가지 제안. 1) 스윙 타이머를 사용하여 애니메이션을 원하십니까? 2) 사용자 정의 페인트는 paint() 메소드가 아니라 paintComponent() 메소드를 대체하여 수행됩니다. – camickr
JPanel 클래스에서 실행 파일을 당겨 코드를 분리 해 보았습니다. 사실 이것은 단지 좋은 습관 일뿐 아니라 문제를 조금 더 시각화하는 데 도움이된다는 것을 알 수 있습니다. – christopher