gpt4 book ai didi

java - BufferStrategy 清理框架背景

转载 作者:行者123 更新时间:2023-12-02 12:04:29 26 4
gpt4 key购买 nike

我尝试使用graphics2DJFrame在Java中制作一个简单的GUI。我在 JFrame 上添加了背景颜色,在 initWindow() 方法中输入 this.setBackground(new Color(54, 71, 99)) 。事实证明,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());
}
}

最佳答案

How Do I make it NOT clear the main background?

你不能。除了 Canvas 是不透明的(无法更改)之外,BufferStrategy 还具有多个页面来绘制内容(从而允许执行页面翻转) )。结合起来,这将导致无法维护父容器的背景。

相反,您应该(事实上,您必须)在每次调用 render 时清除要绘制的缓冲区的 Graphics 上下文,否则您将在之前画过的东西上画画。

一种技术可能是生成一个带有“静态”内容的 BufferedImage 并首先将其绘制到缓冲区

关于java - BufferStrategy 清理框架背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46998916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com