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
со "статическим" содержимым и просто зарисуйте это в буфер первым