Java - 图形像素未正确更新?

时间:2017-03-26 02:01:37

标签: java arrays graphics pixels

现在我只是想让屏幕上显示我的游戏窗口,我认为一切都会好,除了整个窗口上没有显示红色的事实。不知道为什么,我已经多次查看我的代码并且无法解决问题。这是我的代码:

package game;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import javax.swing.JFrame;

public class Game extends Canvas implements Runnable {
    private final String GAME_NAME;
    private final int GAME_WIDTH;
    private final int GAME_HEIGHT;
    private final int SCALE;

    private boolean isRunning;
    private JFrame frame;
    private BufferedImage image;
    private int[] pixels;

    public Game(String name, int width, int aspectRatio[], int scale) {
        // Variabe Initialization
        this.GAME_NAME = name;
        this.GAME_WIDTH = width;
        this.GAME_HEIGHT = width / aspectRatio[0] * aspectRatio[1];
        this.SCALE = scale;

        this.image = new BufferedImage(GAME_WIDTH, GAME_WIDTH, BufferedImage.TYPE_INT_RGB);
        this.pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();

        this.frame = new JFrame(GAME_NAME);

        Init();
    }

    private void Init() {
        // Frame Setup
        setMinimumSize(new Dimension(GAME_WIDTH * SCALE, GAME_HEIGHT * SCALE));
        setMaximumSize(new Dimension(GAME_WIDTH * SCALE, GAME_HEIGHT * SCALE));
        setPreferredSize(new Dimension(GAME_WIDTH * SCALE, GAME_HEIGHT * SCALE));

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        frame.add(this, BorderLayout.CENTER);
        frame.pack();

        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private void Start() {
        isRunning = true;
        new Thread(this).start();
    }

    private void Stop() {
        isRunning = false;
    }

    @Override
    public void run() {
        long lastTime = System.nanoTime();
        long timer = System.currentTimeMillis();

        final double ns = 1000000000d / 60d;
        double delta = 0d;

        int frames = 0;
        int updates = 0;

        while (isRunning) {
            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;

            while (delta >= 1) {
                updates++;
                Update();
                delta--;
            }

            Render();
            frames++;

            if (System.currentTimeMillis() - timer > 1000) {
                timer += 1000;
                frame.setTitle(GAME_NAME + "  |  " + updates + " ups, " + frames + " fps");

                updates = 0;
                frames = 0;
            }
        }
    }

    public void Update() {
        for (int y = 0; y < GAME_HEIGHT; y++) {
            for (int x = 0; x < GAME_WIDTH; x++) {
                pixels[x + y * GAME_WIDTH] = 0xffff0000;
            }
        }
    }

    public void Render() {
        BufferStrategy bs = getBufferStrategy();

        if (bs == null) {
            createBufferStrategy(3);
            requestFocus();
            return;
        }

        Graphics g = bs.getDrawGraphics();
        {
            g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
        }
        g.dispose();
        bs.show();
    }

    public static void main(String[] args) {
        new Game("Game", 160, new int[]{12, 9}, 1).Start();
    }
}

1 个答案:

答案 0 :(得分:1)

您不小心将GAME_WIDTH作为height构造函数调用的BufferedImage参数传递:

public Game(String name, int width, int aspectRatio[], int scale) {
    // Variabe Initialization
    this.GAME_NAME = name;
    this.GAME_WIDTH = width;
    this.GAME_HEIGHT = width / aspectRatio[0] * aspectRatio[1];
    this.SCALE = scale;

    this.image = new BufferedImage(GAME_WIDTH, GAME_WIDTH, BufferedImage.TYPE_INT_RGB);
    //                                         ^^^^^^^^^^
    this.pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();

    this.frame = new JFrame(GAME_NAME);

    Init();
}

您可能打算使用GAME_HEIGHT

this.image = new BufferedImage(GAME_WIDTH, GAME_HEIGHT, BufferedImage.TYPE_INT_RGB);