2014-05-14 3 views
1

이 튜토리얼을 따르려고했는데 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(); 
    } 
} 
} 
+0

정확히 작동하지 않는 기능은 무엇입니까? – kai

+0

.. 그리고 귀하의 질문은 무엇입니까? –

+0

와우, 미안, 나는 정말로 더 많이 설명해야한다. 별은 단순히 화면에 그려지지 않습니다. 필자는 모든 메소드를 테스트하여 System.out.println으로 실행 중인지 확인하고 모든 것이 올바르게 호출 된 것 같습니다. 여러 개의 이미지 파일을 시험해 보았습니다. 패키지 폴더의 .java 파일 바로 옆에 넣었습니다. –

답변

0

이클립스를 사용하는 경우 원본 폴더를 만들고 해당 이미지를 원본 폴더에 추가해야합니다. 그러면 다음을 사용할 수 있습니다.

ImageIcon ii = new ImageIcon(getClass().getResource("/imageName.png")); 
+0

좋았어, 그랬어. 감사! –

관련 문제