【问题标题】:Graphics animation with multiple images具有多个图像的图形动画
【发布时间】:2014-03-30 14:43:27
【问题描述】:

大家好,* 的人们,我目前正在创建一个小游戏,只是为了了解更多关于 Java 中的图形和游戏创建的知识。但是,我被困住了。我试图通过循环几个小图像然后重新绘制每个图像来创建一个“行走动画”。我不确定是否有特定的方法可以做到这一点,或者图像是否被重新绘制得如此之快以至于我实际上看不到“动画”。我目前已将游戏分解为 Ninja、GameBoard 和 Interface 类。该界面执行基本的 GUI 创建调用并将 GameBoard 添加到 GUI。 GameBoard 具有键盘侦听器并将图像绘制到板上。 Ninja 类具有键盘事件,基本上负责为忍者动画获取正确的图像。

接口类

import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import javax.swing.*;

public class Interface extends JFrame
{

int height;
int width;

public Interface()
{
    height = 600;
    width = 600;
    initInterface();
}

public Interface(int h, int w)
{
    height = h;
    width = w;
    initInterface();

}

private void initInterface()
{
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.add(new GameBoard());
    this.setTitle("Ninja *");
    this.setSize(height,width);
    this.setResizable(false);
}




}

游戏板类

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class GameBoard extends JPanel
{

public Ninja ninja;

public GameBoard()
{
    addKeyListener(new TAdapter());
    setFocusable(true);
    setBackground(Color.BLACK);
    setDoubleBuffered(true);
    ninja = new Ninja();
}

public void paint(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;

    g2.drawImage(ninja.getImage(), 20,20,null);
}

private class TAdapter extends KeyAdapter
{
    public void keyPressed(KeyEvent e)
    {

       ninja.keyPressed(e, 1);
       repaint();
       ninja.keyPressed(e, 2);
       repaint();

    }


    public void keyReleased(KeyEvent e)
    {
        ninja.keyReleased(e);
        repaint();
    }
}
}

忍者班

import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class Ninja
{
Image ninja;


public Ninja()
{
    ImageIcon iI = new ImageIcon(this.getClass().getResource("nin1.png"));
    ninja = iI.getImage();

}

public Image getImage()
{
    return ninja;
}

public void keyPressed(KeyEvent e, int count)
{
    if (e.getKeyCode() == KeyEvent.VK_RIGHT)
    {

        if (count == 1)
        {
            ImageIcon icon = new ImageIcon(this.getClass().getResource("nin2.png"));
            ninja = icon.getImage();
        }

        else
        {
            ImageIcon icon = new ImageIcon(this.getClass().getResource("nin3.png"));
            ninja = icon.getImage();
        }

    }


}


public void keyReleased(KeyEvent e)
{
    if (e.getKeyCode() == 39)
    {
        ImageIcon icon = new ImageIcon(this.getClass().getResource("nin1.png"));
        ninja = icon.getImage();
    }
}



}

【问题讨论】:

  • 您的问题是什么?听众不工作吗?您想在特定时间间隔后旋转图像吗?请总结您的问题。
  • 哦,抱歉。基本上,当我按下右箭头键时,我希望绘制第一个行走的 .png,然后绘制第二个 .png。但是,我最终只得到了第二个 .png,至少我可以看到哪个被绘制了。因此,当我击中右箭头时,我想要绘制两个图像,以创造一种行走的错觉。只有一个节目。
  • 使用 Swing 计时器在第一张和第二张图像绘制之间设置延迟。

标签: java swing graphics awt


【解决方案1】:

您不应在Event Dispatch Thread 上使用Thread.sleep(..)(或任何Thread,其中睡眠会导致不必要的执行阻塞),因为这会导致UI 看起来冻结。

尝试任何一个:


下面的帖子中提到了很多方法以及一些好的建议

【讨论】:

  • 这确实有效,谢谢!我需要解决一些时间问题,但这确实有效!
  • @CorySmith 你必须使用摇摆计时器在这里阅读更多内容How to use Timers 并且你应该覆盖paintComponent() 而不是paint 并在第一行调用super.paintComponent() 以遵循图形绘画方法链。
  • 哦,谢谢 Nachokk,我会重写paintComponent()。可悲的是,现在我正在处理接收多次按键(按住右箭头)的下一个问题,这是重置计时器并使“角色”以超快速度行走的一些方法。
  • @CorySmith 看到这个site 有关于使用键盘、使用 keyBindings 和 keylisteners 的运动示例
最近更新 更多