Paint方法不起作用

时间:2014-09-27 15:14:47

标签: java paint

我正在尝试制作一个应该在屏幕上绘制角色的2D游戏。但是当我运行它时,我只是得到一个黑屏。

重点:

public class StartingClass extends Applet implements Runnable, KeyListener {

    private static final long serialVersionUID = 1L;
    private Walrus walrus;
    private Image image, character;
    private Graphics second;
    private URL base;

    @Override
    public void init() {

        setSize(800, 480);
        setBackground(Color.BLACK);
        setFocusable(true);
        addKeyListener(this);

        Frame frame = (Frame) this.getParent().getParent();
        frame.setTitle("Applet");
        try {
            base = getDocumentBase();
        } catch (Exception e) {
            // TODO: handle exception
        }

        // Image Setups
        character = getImage(base, "src/data/walrus_right.png");

    }

    @Override
    public void start() {
        walrus = new Walrus();

        Thread thread = new Thread(this);
        thread.start();
    }

    @Override
    public void stop() {
        // TODO Auto-generated method stub
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void run() {
        while (true) {
            walrus.update();
            repaint();

            try {
                Thread.sleep(17);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void update(Graphics g) {
        if (image == null) {
            image = createImage(this.getWidth(), this.getHeight());
            second = image.getGraphics();
        }

        second.setColor(getBackground());
        second.fillRect(0, 0, getWidth(), getHeight());
        second.setColor(getForeground());
        paint(second);

        g.drawImage(image, 0, 0, this);     
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(character, walrus.getCenterX() - 61, walrus.getCenterY() - 63, this);

    }
}

另外,这是我的另一堂课:

public class Walrus {

private int centerX = 100;
private int centerY = 382;
private boolean jumped = false;

private int speedX = 0;
private int speedY = 1;


public void update() {

    // Moves Character or Scrolls Background accordingly.
    if (speedX < 0) {
        centerX += speedX;
    } else if (speedX == 0) {
        System.out.println("Do not scroll the background.");

    } else {
        if (centerX <= 150) {
            centerX += speedX;
        } else {
            System.out.println("Scroll Background Here");
        }
    }

    // Updates Y Position

    if (centerY + speedY >= 382) {
        centerY = 382;
    }else{                        
                    centerY += speedY;
            }

    // Handles Jumping
    if (jumped == true) {
        speedY += 1;

        if (centerY + speedY >= 382) {
            centerY = 382;
            speedY = 0;
            jumped = false;
        }

    }

    // Prevents going beyond X coordinate of 0
    if (centerX + speedX <= 60) {
        centerX = 61;
    }
}

public void moveRight() {
    speedX = 6;
}

public void moveLeft() {
    speedX = -6;
}

public void stop() {
    speedX = 0;
}

public void jump() {
    if (jumped == false) {
        speedY = -15;
        jumped = true;
    }

}

public int getCenterX() {
    return centerX;
}

public int getCenterY() {
    return centerY;
}

public boolean isJumped() {
    return jumped;
}

public int getSpeedX() {
    return speedX;
}

public int getSpeedY() {
    return speedY;
}

public void setCenterX(int centerX) {
    this.centerX = centerX;
}

public void setCenterY(int centerY) {
    this.centerY = centerY;
}

public void setJumped(boolean jumped) {
    this.jumped = jumped;
}

public void setSpeedX(int speedX) {
    this.speedX = speedX;
}

public void setSpeedY(int speedY) {
    this.speedY = speedY;
}

}

此时我没有遇到任何错误,但是它无法正常工作。

1 个答案:

答案 0 :(得分:0)

问题是您的图片未加载。这条线

getImage(base, "src/data/walrus_right.png");

尝试读取部署的小程序的图像,并且会安静地失败(不会抛出错误),这就是造成混乱的原因。尝试用

替换它
ImageIO.read(new File(getClass().getResource("relative/path.png").getPath()));

您应该替换getResource API下指定的路径。

修改

将电话分成几个电话:

Class<? extends StartingClass> clas = getClass();
URL url = clas.getResource("relative/path.png");
String path = url.getPath();
File file = new File(path);
try {
    Image image = ImageIO.read(file);
} catch (IOException e) {
    e.printStackTrace();
}

并逐步调试调试器以查看哪一行引发错误。我的猜测是该文件不在正确的位置,导致getResource返回null,这会导致new File(path)抛出NullPointerException