0

graphics2Dと を使用して Java で簡単な GUI を作成しようとしましたJFrame。メソッドthis.setBackground(new Color(54, 71, 99))内で入力する JFrame に背景色を追加しました。その背景をクリアし、これを引き起こす行を再描画していないinitWindow()ことが判明しましたメソッドの最後の行.backBufferrender()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());
    }
}
4

1 に答える 1