Как нарисовать одно и то же движущееся изображение несколько раз?

Здравствуйте, я играю в платформер, и когда вы нажимаете пробел, персонаж стреляет огненным шаром, который перемещается по экрану, но когда вы снова нажимаете пробел, координаты огненного шара возвращаются к координатам игрока, а не рисует другой огненный шар, чего я и хочу.

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();
}



}

2 ответа

Решение

@KevinWorkman прав. Вам нужна какая-то структура данных, чтобы удерживать огненные шары. В приведенном ниже примере я использовал List из Fireball,

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);
            }
        });
    }
}

Вы пытались создать еще один экземпляр 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 объекты, а затем использовать ArrayList из Image объекты:

ArrayList<Image> fireballs = new ArrayList<Image>();

Узнайте больше о ArrayList здесь.

Другие вопросы по тегам