이 튜토리얼을 따르려고했는데 http://zetcode.com/tutorials/javagamestutorial/animation/ 페이지에있는 세 가지 예제 중 아무 것도 나를 위해 작동하지 않는 것 같습니다. 그 중 하나는 스윙 타이머를 사용하고, 하나는 유틸리티 타이머를 사용하고 페이지에 따르면 마지막이자 가장 효과적이고 정확한 것은 스레드를 사용하여 애니메이션을 작성하는 것입니다.스레드 애니메이션 예제가 작동하지 않습니다.
내가 게임을 만들기 위해 애니메이션을 사용할 때 일을 할 것이라고 생각하기 때문에 스레드를 사용하여 보여줄 것입니다.
ThreadAnimationExample.java은 (튜토리얼은 star.java하지만 분명히 그 실 거예요 작업이라고합니다)
import java.awt.EventQueue;
import javax.swing.JFrame;
public class ThreadAnimationExample extends JFrame {
public ThreadAnimationExample() {
add(new Board());
setTitle("Star");
pack();
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame ex = new ThreadAnimationExample();
ex.setVisible(true);
}
});
}
}
Board.java (메인 클래스)
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Board extends JPanel
implements Runnable {
private final int B_WIDTH = 350;
private final int B_HEIGHT = 350;
private final int INITIAL_X = -40;
private final int INITIAL_Y = -40;
private final int DELAY = 25;
private Image star;
private Thread animator;
private int x, y;
public Board() {
loadImage();
initBoard();
}
private void loadImage() {
ImageIcon ii = new ImageIcon("star.png");
star = ii.getImage();
}
private void initBoard() {
setBackground(Color.BLACK);
setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
setDoubleBuffered(true);
x = INITIAL_X;
y = INITIAL_Y;
}
@Override
public void addNotify() {
super.addNotify();
animator = new Thread(this);
animator.start();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
drawStar(g);
}
private void drawStar(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(star, x, y, this);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
private void cycle() {
x += 1;
y += 1;
if (y > B_HEIGHT) {
y = INITIAL_Y;
x = INITIAL_X;
}
}
@Override
public void run() {
long beforeTime, timeDiff, sleep;
beforeTime = System.currentTimeMillis();
while (true) {
cycle();
repaint();
timeDiff = System.currentTimeMillis() - beforeTime;
sleep = DELAY - timeDiff;
if (sleep < 0) {
sleep = 2;
}
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
System.out.println("Interrupted: " + e.getMessage());
}
beforeTime = System.currentTimeMillis();
}
}
}
정확히 작동하지 않는 기능은 무엇입니까? – kai
.. 그리고 귀하의 질문은 무엇입니까? –
와우, 미안, 나는 정말로 더 많이 설명해야한다. 별은 단순히 화면에 그려지지 않습니다. 필자는 모든 메소드를 테스트하여 System.out.println으로 실행 중인지 확인하고 모든 것이 올바르게 호출 된 것 같습니다. 여러 개의 이미지 파일을 시험해 보았습니다. 패키지 폴더의 .java 파일 바로 옆에 넣었습니다. –