精灵绘图问题

时间:2015-06-04 18:36:34

标签: java sprite

当我使用此代码时,图像绘制(从我定义的spritesheet部分),但它重绘它在前一个实例上。我需要"图像"到"移动"。我使用paint方法,使用Graphics重绘init()方法中定义的sprite。我只是想创造一个" minion"一旦它被添加到程序中,开始"行走"从屏幕的左下角到右边(没有用户动作移动它)。我现在可以让它只是拍摄图像"涂抹"它跨越屏幕的底部(它不断地将其自身描绘)

(为简单起见,删除了导入)

 public class Main extends JFrame {

    BufferedImage sprite;
    int War_x = 10, War_y = 640, War_dx = 1;

    public Main()
    {
        //(X,Y) ---- (LEFT,UP)
        //Window theGUI = new Window();
        //JFrame theGUI = new JFrame();
        setSize(870,720);
        setTitle("Game");
        setBackground(Color.red);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);

        init();

    }
    public void init()
    {
        BufferedImageLoader loader = new BufferedImageLoader();
        BufferedImage spriteSheet = null;
        System.out.println("bruh");
        try {
            spriteSheet = loader.loadImage("warrior.png");
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        SpriteSheet ss = new SpriteSheet(spriteSheet);

        sprite = ss.grabSprite(0,130,32,36);


    } 
@Override
public void paint(Graphics g){

    g.drawImage(sprite, War_x, War_y,64, 64, null);
    warrior start = new warrior();
    start.start();
    repaint();
}

public static void main(String[] args){
    Main main = new Main();
}


public class warrior implements ActionListener{
    public Timer T = new Timer(100, this);

    public void start(){
        T.start();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        War_x += War_dx;
    }

}

}

2 个答案:

答案 0 :(得分:0)

首先,不建议直接在JFrame上绘图。这是你遇到问题"涂抹/等等问题的原因之一。使用Canvas或类似的东西来绘制。也可能更好地绘制到像BufferedImage这样的东西,只是将其绘制到屏幕而不是直接绘制到屏幕上。

其次,如果你想让它不断移动我会把它放在外面的循环中,只需让画布从一个单独的线程自动更新。

这是一个开始使用主题https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

的链接

答案 1 :(得分:0)

为了让精灵“移动”,你需要将他从画布中移除,然后将他拉到新的位置。

为了实际执行此操作,您可能必须执行以下操作:

  1. 清除屏幕
  2. 重绘更新背景
  3. 重绘更新的实体
  4. 因此,对于实际情况,假设您的背景只是一个纯白色矩形,其中canvasWidthcanvasHeight是画布的宽度和高度,您的绘制方法将如下所示:

    @Override
    public void paint(Graphics g){
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, canvasWidth, canvasHeight);
    
        g.drawImage(sprite, War_x, War_y,64, 64, null);
        repaint();
    }