BufferStrategy очищает фон рамки

Я попытался сделать простой графический интерфейс в Java, используя graphics2D а также JFrame, Я добавил цвет фона при наборе текста в JFrame this.setBackground(new Color(54, 71, 99)) внутри initWindow() метод. Оказалось, что backBuffer очищал этот фон и не перекрашивал строку, которая вызывает это в render() метод, последняя строка backBuffer.show(),

Как сделать так, чтобы НЕ очистить основной фон?

package asteroids;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

import javax.swing.JFrame;

public class Main extends Canvas implements KeyListener {

    private boolean gameOver;
    private BufferStrategy backBuffer;  
    private Dimension dimension = new Dimension(Config.WINDOW_WH[0], Config.WINDOW_WH[1]);
    private List<Star> stars = new ArrayList<Star>();
    private HashMap<Integer,Boolean> keyDownMap = new HashMap<Integer, Boolean>();

    public Main() {
        // Initialize Window
        initWindow();
        addKeyListener(this);

        this.setBackground(new Color(54, 71, 99));
        this.createBufferStrategy(2);               
        backBuffer = this.getBufferStrategy();

        // init variables
        gameOver = false;

        // Generating stars
        generateStars();

        // Init loop
        gameLoop();
    }

    public void initWindow(){
        JFrame window = new JFrame("Asteroids"); 
        setPreferredSize(dimension); 

        window.add(this);           
        window.pack();  
        window.setResizable(false);
        window.setVisible(true); 
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBackground(new Color(54, 71, 99));

        window.requestFocus();
    }

    public void update() {
        if(keyDownMap.containsKey(KeyEvent.VK_ESCAPE)){
            gameOver = false;
            System.exit(0);
        }
    }

    public void render(){
        Graphics2D g = (Graphics2D) backBuffer.getDrawGraphics();
        g.setColor(Color.WHITE);
        for(Star s: stars) {
            g.fillOval(s.posx - (s.width/2), s.posy - (s.height/2), s.width, s.height);
        }
        g.dispose();
        backBuffer.show();
    }

    public void generateStars() {
        for(int i = 0;i < 20;i++) {
            int starX = new Random().nextInt(Config.WINDOW_WH[0]-10)+5;
            int starY = new Random().nextInt(Config.WINDOW_WH[1]-10)+5;
            stars.add(new Star(starX, starY));
        }
    }

    public void gameLoop(){
        while(!gameOver){
            update();
            render();

            try{ Thread.sleep(20);}catch(Exception e){};
        }
    }

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


    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        keyDownMap.put(e.getKeyCode(), true);
    }

    @Override
    public void keyReleased(KeyEvent e) {
        keyDownMap.remove(e.getKeyCode());
    }
}

1 ответ

Как сделать так, чтобы НЕ очистить основной фон?

Ты не можешь Помимо Canvas был непрозрачным (который нельзя изменить), BufferStrategy также имеет более одной страницы, на которую он рисует свой контент (что позволяет выполнять перелистывание страниц). В совокупности это сделало бы невозможным сохранение фона родительского контейнера.

Вместо этого вы должны (на самом деле, вы должны) очистить Graphics контекст буфера, который вы рисуете, каждый раз render называется, иначе вы будете рисовать на то, что когда-либо было ранее написано на нем.

Одним из методов может быть создание BufferedImage со "статическим" содержимым и просто зарисуйте это в буфер первым

Другие вопросы по тегам