有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java线程动画示例不起作用

我试着学习这些教程,但那一页上的三个例子似乎都不适合我。其中一个使用swing定时器,一个使用实用定时器,最后一个,据页面所示,应该是最有效和最准确的,使用一个线程来制作动画

我将向你们展示一个使用线程的方法,因为我认为这是我在使用动画制作游戏时所做的事情

例如,线程动画。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);                
        }
    });
}
}

董事会。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) 个答案

  1. # 1 楼答案

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

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