我正在制作一个平台游戏,当你按下空格键时,角色会射击一个火球,该火球会在屏幕上移动,但是当你再次按下空格键时,该火球的坐标将重新设置为玩家的坐标,而不是绘制我想要的另一个火球。
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是正确的。你需要某种数据结构来容纳火球。在下面的示例中,我使用List的Fireball。
@KevinWorkman
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值,然后调用重绘
@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("http://fightingstreet.com/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); } }); } }