如何将同一运动图像多次画画吗? [英] How do I draw the same moving image multiple times?

查看:184
本文介绍了如何将同一运动图像多次画画吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,我正在做一个成熟的游戏,当你preSS空间的字符射击是在屏幕上移动的火球,但是当你preSS空间再次火球的坐标设置回玩家的坐标,而不是绘制另一个火球这就是我想要的。

 进口java.awt中的*。
进口的javax.swing *。公共类火灾继承JPanel {
图片火球;
私人INT X = 155000,Y = 155000;
Player播放器=新播放器();公共无效漆(图形G){
    g.drawImage(火球,X,Y,NULL);
}公共消防(){
}公共无效更新(){
    火球=新的ImageIcon(C:\\\\ \\\\用户\\\\ steven.greens10桌面\\\\ \\\\程序原始的Java平台\\\\ \\\\ \\\\资源fireball.png)。的getImage();
    X + = 5;
    如果(X GT; 640){
        X = 155000;
    }
}公共无效拍(玩家P){
    X = p.getX();
    Y = p.getY();
    重绘();
}}


解决方案

@KevinWorkman是正确的。你需要某种形式的数据结构来保存火球。在下面的例子中我用火球列表

 列表<&火球GT;火球;
...
私有类火球{    图片火球;
    INT X = 150;
    INT Y = 125;    公共火球(形象画像){
        火球=图像;
    }    公共无效drawFireball(图形G){
        g.drawImage(火球,X,Y,50,50,NULL);
    }
}

要画他们,我只是遍历它们。为了让他们继续前进我只是营养不良的人口增加了定时器的x值,并调用重绘

  @覆盖
保护无效paintComponent(图形G){
    super.paintComponent方法(G);
    ...
    对于(火球球:火球){
        ball.drawFireball(G);
    }
}

下面是完整的code

 进口java.awt中的*。
java.awt.event中导入*。
进口java.awt.image.BufferedImage中;
进口java.io.IOException异常;
进口的java.net.URL;
进口的java.util。*;
进口的java.util.List;
导入java.util.logging的*。
进口javax.imageio.ImageIO中;
进口的javax.swing *。
进口javax.swing.Timer中;公共类WannaBeStreetFighter继承JPanel {    私有静态最终诠释D_W = 700;
    私有静态最终诠释D_H = 250;
    私有静态最终诠释X_INC = 10;    清单<&火球GT;火球;
    刘某的BufferedImage;
    火球的BufferedImage;
    背景的BufferedImage;    公共WannaBeStreetFighter(){        尝试{
            刘某= ImageIO.read(新URL(\"http://www.sirlin.net/storage/street_fighter/ryu_hadoken_pose.png?__SQUARESPACE_CACHEVERSION=1226531909576\"));
            背景= ImageIO.read(新URL(http://fightingstreet.com/folders/variousinfofolder/ehondasbath/hondasfz3stage.gif));
            火球= ImageIO.read(新URL(http://farm6.staticflickr.com/5480/12297371495_ec19ded155_o.png));
        }赶上(IOException异常前){
            。Logger.getLogger(WannaBeStreetFighter.class.getName())日志(Level.SEVERE,空,前);
        }        火球=新的LinkedList<>();        定时器定时器=新定时器(40,新的ActionListener(){
            @覆盖
            公共无效的actionPerformed(ActionEvent的五){
                迭代器<&火球GT;它= fireBalls.iterator();
                而(it.hasNext()){
                    火球球= it.next();
                    如果(ball.x> D_W){
                        it.remove();
                        的System.out.println(fireBalls.size());
                    }其他{
                        ball.x + = X_INC;
                        重绘();
                    }
                }
            }
        });
        timer.start();        InputMap中的InputMap = getInputMap中(JComponent.WHEN_IN_FOCUSED_WINDOW);
        inputMap.put(KeyStroke.getKeyStroke(空格),hadouken);
        getActionMap()。把(hadouken,新AbstractAction(){
            @覆盖
            公共无效的actionPerformed(ActionEvent的五){
                fireBalls.add(新火球(火球));
            }
        });    }    @覆盖
    保护无效paintComponent(图形G){
        super.paintComponent方法(G);
        g.drawImage(背景,0,0,D_W,D_H,本);
        g.drawImage(刘某,50,125,150,115,这一点);
        对于(火球球:火球){
            ball.drawFireball(G);
        }
    }    @覆盖
    公共尺寸的get preferredSize(){
        返回新的Dimension(D_W,D_H);
    }    私有类火球{        图片火球;
        INT X = 150;
        INT Y = 125;        公共火球(形象画像){
            火球=图像;
        }        公共无效drawFireball(图形G){
            g.drawImage(火球,X,Y,75,50,NULL);
        }
    }    公共静态无效的主要(字串[] args){
        SwingUtilities.invokeLater(Runnable的新(){
            公共无效的run(){
                JFrame的帧=新的JFrame(最佳街霸永远);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(新WannaBeStreetFighter());
                frame.pack();
                frame.setLocationRelativeTo(NULL);
                frame.setVisible(真);
            }
        });
    }
}

Hello I'm making a platformer game and when you press space the character shoots a fireball that moves across the screen but when you press space again the fireball's coordinates are set back to the player's coordinates rather than drawing another fireball which is what I want.

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 is right. You need some kind of data structure to hold the fireballs. In the example below I used a List of 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);
    }
}

To paint them, I just iterate through them. To make them move forward I just increas the x value in the timer and call repaint

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    ...
    for (Fireball ball : fireBalls) {
        ball.drawFireball(g);
    }
}

Here's the complete code

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

这篇关于如何将同一运动图像多次画画吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆