如何多次绘制相同的运动图像?
你好我正在做一个平台游戏,当你按下空间时,angular色会拍摄一个移动到屏幕上的火球,但是当你再次按下空间的时候,火球的坐标将被重新设置到玩家的坐标上,而不是绘制另一个我想要的火球。
import java.awt.*; import javax.swing.*; public class Fire extends JPanel{ Image fireball; private int x=155000,y=155000; Player player = new Player(); public void paint(Graphics g){ g.drawImage(fireball, x, y, null); } public Fire(){ } public void update(){ fireball = new ImageIcon("C:\\Users\\steven.greens10\\Desktop\\Programs\\Raw Java\\Platform\\res\\fireball.png").getImage(); x+=5; if(x > 640){ x=155000; } } public void shoot(Player p){ x = p.getX(); y = p.getY(); repaint(); } }
@KevinWorkman是对的。 你需要某种数据结构来保存火球。 在下面的例子中,我使用了一个Fireball
List
。
List<Fireball> fireBalls; ... private class Fireball { Image fireball; int x = 150; int y = 125; public Fireball(Image image) { fireball = image; } public void drawFireball(Graphics g) { g.drawImage(fireball, x, y, 50, 50, null); } }
画他们,我只是遍历他们。 为了使它们向前移动,我只是在定时器中增加x值并调用repaint
@Override protected void paintComponent(Graphics g) { super.paintComponent(g); ... for (Fireball ball : fireBalls) { ball.drawFireball(g); } }
这是完整的代码
import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; import java.util.*; import java.util.List; import java.util.logging.*; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.Timer; public class WannaBeStreetFighter extends JPanel { private static final int D_W = 700; private static final int D_H = 250; private static final int X_INC = 10; List<Fireball> fireBalls; BufferedImage ryu; BufferedImage fireball; BufferedImage background; public WannaBeStreetFighter() { try { ryu = ImageIO.read(new URL("http://www.sirlin.net/storage/street_fighter/ryu_hadoken_pose.png?__SQUARESPACE_CACHEVERSION=1226531909576")); background = ImageIO.read(new URL("folders/variousinfofolder/ehondasbath/hondasfz3stage.gif")); fireball = ImageIO.read(new URL("http://farm6.staticflickr.com/5480/12297371495_ec19ded155_o.png")); } catch (IOException ex) { Logger.getLogger(WannaBeStreetFighter.class.getName()).log(Level.SEVERE, null, ex); } fireBalls = new LinkedList<>(); Timer timer = new Timer(40, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Iterator<Fireball> it = fireBalls.iterator(); while (it.hasNext()) { Fireball ball = it.next(); if (ball.x > D_W) { it.remove(); System.out.println(fireBalls.size()); } else { ball.x += X_INC; repaint(); } } } }); timer.start(); InputMap inputMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); inputMap.put(KeyStroke.getKeyStroke("SPACE"), "hadouken"); getActionMap().put("hadouken", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { fireBalls.add(new Fireball(fireball)); } }); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(background, 0, 0, D_W, D_H, this); g.drawImage(ryu, 50, 125, 150, 115, this); for (Fireball ball : fireBalls) { ball.drawFireball(g); } } @Override public Dimension getPreferredSize() { return new Dimension(D_W, D_H); } private class Fireball { Image fireball; int x = 150; int y = 125; public Fireball(Image image) { fireball = image; } public void drawFireball(Graphics g) { g.drawImage(fireball, x, y, 75, 50, null); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame("Best Street Fighter ever"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new WannaBeStreetFighter()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } }
你有没有尝试创build另一个Image
实例? 例如:
Image fireball, firball2;
现在你有两个Image
对象。 所以当你调用g.dawImage(...)
:
public void paint(Graphics g){ g.drawImage(fireball, x, y, null); g.drawImage(fireball2, x+10, y+10, null);//just draw this other Image }
你可以保持绘制多个图像。 此外,我改变了x
和y
位置,所以两个Image
对象不重叠。
现在,如果你想要一堆Image
对象,那么使用一个Image
对象的ArrayList
:
ArrayList<Image> fireballs = new ArrayList<Image>();
在这里阅读更多关于ArrayList。