为什么我的“游戏”的背景会移动?

时间:2015-05-21 19:28:15

标签: java image

我正在尝试自学一些java,而我正在尝试编写一个“游戏”。 到目前为止,我有一个可控制的圈子......

这是我到目前为止所做的:

窗口级

import java.applet.Applet;
import java.awt.Graphics;

public class Window extends GameIntern{

    public void init(){
        setSize(854,480);   
        Thread th = new Thread(this);
        th.start();
        offscreen = createImage(854,480);
        d = offscreen.getGraphics();
        addKeyListener(this);
    }

    public void paint(Graphics g){
        d.clearRect(0,0,854,480);
        d.drawImage(background, 0, 0, this);
        d.drawOval(x, y, 30, 30);
        g.drawImage(offscreen,x,y,this);
    }

    public void update(Graphics g){
        paint(g);
    }
}

和游戏类

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;


public class GameIntern extends Applet implements Runnable , KeyListener {
    public int x,y;
    public Image offscreen;
    public Graphics d;
    public boolean up,down,left,right;
    public BufferedImage background , face;
    public void run() {
        x = 100;
        y = 100;
        try {
            background = ImageIO.read(new File("background.png"));
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        while(true){
            if(left == true){
                x-=3;
                repaint();
            }
            if(right == true){
                x+=3;
                repaint();
            }
            if(up == true){
                y-=3;
                repaint();
            }
            if(down == true){
                y+=3;
                repaint();
            }
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void keyPressed(KeyEvent e) {

        if(e.getKeyCode() == 37){
            left=true;
        }
        if(e.getKeyCode() == 38){
            up=true;
        }
        if(e.getKeyCode() == 39){
            right=true;
        }
        if(e.getKeyCode() == 40){
            down=true;
        }

    }


    public void keyReleased(KeyEvent e) {

        if(e.getKeyCode() == 37){
            left=false;
        }
        if(e.getKeyCode() == 38){
            up=false;
        }
        if(e.getKeyCode() == 39){
            right=false;
        }
        if(e.getKeyCode() == 40){
            down=false;
        }

    }


    public void keyTyped(KeyEvent e){}
}

现在我的问题。当我启动线程并通过箭头键移动时,背景也会移动。 为什么这样,我该如何解决这个问题? 我永远不会改变图像的x和y坐标。

感谢任何帮助或批评。

1 个答案:

答案 0 :(得分:2)

当您进行实际绘图时,执行g.drawImage(offscreen,x,y,this);。这会在x,y的左上角绘制您的屏幕外图像(在您移动圆圈时已经调整过了)。

您需要使用g.drawImage(offscreen,0,0,this);始终在同一位置绘制整个屏幕外图像。