如何在JavaSwing中制作平滑的动画
嗨,我正在为JPanel使用Timer类和repaint方法,但是每当我击中屏幕,太空船在屏幕上移动一半时,它就会缩小并保持在原位。它永远不会到达窗户的底部。当我把它移到右边时也是一样的 另外,当我尝试将其放置在不同的位置时,背景不再是黑色。有人能帮我吗?以下是我的代码示例:如何在JavaSwing中制作平滑的动画,java,swing,animation,Java,Swing,Animation,嗨,我正在为JPanel使用Timer类和repaint方法,但是每当我击中屏幕,太空船在屏幕上移动一半时,它就会缩小并保持在原位。它永远不会到达窗户的底部。当我把它移到右边时也是一样的 另外,当我尝试将其放置在不同的位置时,背景不再是黑色。有人能帮我吗?以下是我的代码示例: package javapaint; import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; import java.aw
package javapaint;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class SpaceShipFlight
{
private JFrame windowFrame;
private BufferedImage shipSprite;
private BufferedImage spaceBackground;
/** MAIN METHOD **/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
SpaceShipFlight window = new SpaceShipFlight();
window.windowFrame.setVisible(true);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}
/** CONSTRUCTOR **/
public SpaceShipFlight() throws IOException
{
/*************************************************************************
SPACE SHIP FLIGHT JFRAME
*************************************************************************/
windowFrame = new JFrame("Space Ship Flight");
windowFrame.setBounds(0, 0, 950, 700);
windowFrame.setBackground(Color.BLACK);
/*************************************************************************
SPACE SHIP FLIGHT SPRITES (FOR DRAWING)
*************************************************************************/
spaceBackground = ImageIO.read(new File("Space (Medium).png"));
// 450 x 374
shipSprite = ImageIO.read(new File("Ship Sprite.png"));
// 64 x 64 png of space ship
/*************************************************************************
SPACE SHIP FLIGHT JPANEL (FOR DRAWING)
*************************************************************************/
SpacePanel spacePanel = new SpacePanel();
windowFrame.add(spacePanel);
/*************************************************************************
SPACE SHIP FLIGHT TIMER
*************************************************************************/
Timer timer = new Timer(10, new AnimationListener(spacePanel));
timer.start();
/*************************************************************************
EVENT HANDLER TO MOVE SPACE SHIP
*************************************************************************/
/*
EventHandler <KeyEvent> moveShip = new EventHandler<KeyEvent> ()
{
@Override
public void handle(KeyEvent event)
{
if (event.getCharacter().equalsIgnoreCase("X"))
{
spacePanel.setX( spacePanel.getX() + 1 );
}
}
};
*/
KeyListener moveShip = new KeyListener()
{
@Override
public void keyTyped(KeyEvent e)
{
}
@Override
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_RIGHT && spacePanel.getX() < 375)
{
spacePanel.setX( spacePanel.getX() + 5 );
spacePanel.repaint();
}
if (e.getKeyCode() == KeyEvent.VK_LEFT && spacePanel.getX() > 0)
{
spacePanel.setX( spacePanel.getX() - 5);
spacePanel.repaint();
}
if (e.getKeyCode() == KeyEvent.VK_UP && spacePanel.getY() > 0)
{
spacePanel.setY( spacePanel.getY() - 5);
spacePanel.repaint();
}
if (e.getKeyCode() == KeyEvent.VK_DOWN && spacePanel.getY() < 700)
{
spacePanel.setY( spacePanel.getY() + 5 );
spacePanel.repaint();
}
if (e.getKeyCode() == KeyEvent.VK_X)
{
System.out.printf("X: %d, Y: %d\n", spacePanel.getX(),
spacePanel.getY());
}
}
@Override
public void keyReleased(KeyEvent e)
{
}
};
windowFrame.addKeyListener(moveShip);
}
/** ANIMATION LISTENER CLASS **/
public static class AnimationListener implements ActionListener
{
private SpacePanel panel;
private Graphics graphics;
public AnimationListener(SpacePanel panel)
{
this.panel = panel;
this.graphics = panel.getGraphics();
}
@Override
public void actionPerformed(ActionEvent e)
{
panel.repaint();
}
}
/** SPACE PANEL SUBCLASS **/
public class SpacePanel extends JPanel
{
// Variables for the space ship's position temporarily placed here
private int x;
private int y;
// Constructor
public SpacePanel()
{
super();
x = 0;
y = 0;
}
// Getters
public int getX()
{
return x;
}
public int getY()
{
return y;
}
// Setters
public void setX(int newX)
{
x = newX;
}
public void setY(int newY)
{
y = newY;
}
@Override
public void paint(Graphics g)
{
g.drawImage(spaceBackground, 0, 0, this);
g.drawImage(shipSprite, x, y, this);
}
}
}
包javapaint;
导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共级宇宙飞船飞行
{
私有JFrame窗口框架;
私有缓冲映像shipSprite;
私有缓冲图像空间背景;
/**主要方法**/
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable()
{
公开募捐
{
尝试
{
太空飞船飞行窗口=新太空飞船飞行();
window.windowFrame.setVisible(true);
}
捕获(例外e)
{
e、 printStackTrace();
}
}
});
}
/**建造师**/
公共宇宙飞船飞行()引发异常
{
/*************************************************************************
宇宙飞船飞行框架
*************************************************************************/
windowFrame=新的JFrame(“太空船飞行”);
窗框.立根(0,0,950,700);
窗框。背景(颜色。黑色);
/*************************************************************************
太空船飞行精灵(用于绘图)
*************************************************************************/
spaceBackground=ImageIO.read(新文件(“Space(Medium.png”));
//450 x 374
shipSprite=ImageIO.read(新文件(“shipSprite.png”);
//太空船的64 x 64 png
/*************************************************************************
太空船飞行JPANEL(用于绘图)
*************************************************************************/
SpacePanel SpacePanel=新建SpacePanel();
windowFrame.add(spacePanel);
/*************************************************************************
宇宙飞船飞行计时器
*************************************************************************/
计时器计时器=新计时器(10,新的AnimationListener(spacePanel));
timer.start();
/*************************************************************************
事件处理程序移动太空船
*************************************************************************/
/*
EventHandler moveShip=新的EventHandler()
{
@凌驾
公共无效句柄(KeyEvent事件)
{
if(event.getCharacter().equalsIgnoreCase(“X”))
{
spacePanel.setX(spacePanel.getX()+1);
}
}
};
*/
KeyListener moveShip=新的KeyListener()
{
@凌驾
public void keyTyped(KeyEvent e)
{
}
@凌驾
按下公共无效键(按键事件e)
{
如果(例如getKeyCode()==KeyEvent.VK_RIGHT&&spacePanel.getX()<375)
{
spacePanel.setX(spacePanel.getX()+5);
spacePanel.repaint();
}
如果(例如getKeyCode()==KeyEvent.VK_LEFT&&spacePanel.getX()>0)
{
setX(spacePanel.getX()-5);
spacePanel.repaint();
}
如果(例如getKeyCode()==KeyEvent.VK_UP&&spacePanel.getY()>0)
{
setY(spacePanel.getY()-5);
spacePanel.repaint();
}
如果(例如getKeyCode()==KeyEvent.VK_DOWN&&spacePanel.getY()<700)
{
setY(spacePanel.getY()+5);
spacePanel.repaint();
}
如果(例如getKeyCode()==KeyEvent.VK_X)
{
System.out.printf(“X:%d,Y:%d\n”,spacePanel.getX(),
spacePanel.getY());
}
}
@凌驾
公共无效密钥已释放(密钥事件e)
{
}
};
windowFrame.addKeyListener(moveShip);
}
/**动画侦听器类**/
公共静态类AnimationListener实现ActionListener
{
私人空间小组;
私有图形;
公共动画监听器(SpacePanel面板)
{
this.panel=面板;
this.graphics=panel.getGraphics();
}
@凌驾
已执行的公共无效操作(操作事件e)
{
panel.repaint();
}
}
/**空间面板子类**/
公共类SpacePanel扩展了JPanel
{
//太空船位置的变量暂时放在这里
私人INTX;
私营企业;
//建造师
公共空间小组()
{
超级();
x=0;
y=0;
}