내 캔버스 구현이 계속 깜박이는 이유는 무엇입니까?

13842 단어 javahelpgamedev
그래서 RuntDeale의 Python 버전에서 작동하는 플레이어 캐릭터를 얻은 후 얼마 지나지 않아 Java로 옮기기 시작했고 진행이 꽤 순조로웠습니다. 창, 아이콘 및 리소스 폴더가 모두 제대로 작동합니다.
하지만 내 자신의 캔버스 구현을 만들려고 하면 계속 업데이트할 때 계속 깜박입니다. 그리고 업데이트하지 않으면 아무것도 표시되지 않습니다(흰색 화면만 표시됨).

클래스는 다음과 같습니다.

/**
* Calin Baenen's version of a canvas element.
*/
class CPane {

    // Debug variables.
    /**
    * The canvas itself.
    */
    private final JPanel canvas; // Canvas.
    /**
    * The buffer that adds data to the canvas.
    */
    private BufferedImage buffer; // Buffer.



    // Constructor.
    public CPane(int width, int height) {
        this(0, 0, width, height);
    }
    public CPane(int width, int height, Color initialColor) {
        this(0, 0, width, height, initialColor);
    }
    public CPane(int x, int y, int width, int height) {
        this(x, y, width, height, Color.WHITE);
    }
    public CPane(int x, int y, int width, int height, Color initialColor) {
        this(x, y, width, height, initialColor, Color.WHITE);
    }
    public CPane(int x, int y, int width, int height, Color initialColor, Color baseColor) {

        this.canvas = new JPanel(); // Make an element to display the drawing on.
        canvas.setBounds(x, y, width, height); // Set the bounds of the canvas.
        canvas.setBackground(baseColor); // Make the canvas white.
        canvas.setDoubleBuffered(true); // Make the canvas double buffered.

        buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); // Set the buffer.
        Graphics ctx = buffer.getGraphics(); // Get the graphics for the buffer.

        // Paint the image with an initisl color.
        ctx.setColor(initialColor); // Set color.
        ctx.drawRect(0, 0, width, height); // Draw.
        ctx.dispose(); // Dispose.

    }



    /**
    * Draws a rectangle to the screen by filling an area with color.
    */
    public void drawRect(int x, int y, int width, int height, Color color) {
        Graphics ctx = buffer.getGraphics(); // Get the graphics.
        ctx.setColor(color); // Set the context's color.
        ctx.fillRect(x, y, width, height); // Draw a rectangle.
        ctx.dispose(); // Dispose the graphics.
        this.update(); // Update the canvas.
    }



    /**
    * Draw an image to the canvas.
    */
    public void drawImage(Image image, int x, int y) {
        this.drawImage(image, x, y, image.getWidth(null), image.getHeight(null));
    }
    /**
    * Draw an image to the canvas.
    */
    public void drawImage(Image image, int x, int y, int width, int height) {
        Image shot = image.getScaledInstance(width, height, Image.SCALE_FAST); // Get the scaled image to draw.
        Graphics ctx = buffer.getGraphics(); // Get the graphics.
        ctx.drawImage(shot, x, y, null); // Draw the image.
        ctx.dispose(); // Dispose.
        this.update(); // Update the canvas.
    }



    /**
    * Update the graphics.
    */
    public void update() {
        try {
            Graphics display = canvas.getGraphics(); // Get the display graphics.
            display.drawImage(buffer, 0, 0, null); // Draw the bufer.
            display.dispose(); // Dispose the display.
        } catch(Exception error) {}
    }

}

update 메서드 자체에 있는 것으로 알고 있지만 이 버그를 어떻게 고칠 수 있습니까?

고마워!건배!

좋은 웹페이지 즐겨찾기