线程动画示例不起作用

时间:2014-05-14 08:38:08

标签: java swing animation thread-sleep

我试图按照这些教程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();
    }
}
}

1 个答案:

答案 0 :(得分:0)

如果您使用的是Eclipse,则应创建源文件夹并将该图像添加到源文件夹。然后你可以用这个:

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