2017-10-29 3 views
0

私は、Javaで簡単なGUIを作成しようとしました。graphics2DJFrameを使用しています。 initWindow()メソッド内にthis.setBackground(new Color(54, 71, 99))と入力してJFrameに背景色を追加しました。 backBufferがその背景を消去していて、これを引き起こす行を再描画していないことが判明したのは、render()メソッドの最終行backBuffer.show()です。BufferStrategy cleansフレームの背景

どうすればいいですかNOTメインの背景をクリアしますか?

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

1)にそれをペイントするかもしれません](http://www.sscce.org/)。 2)ソースコード内の空白の空白行が1つ必要です。 '{'の前または '}'の前の空白行も通常は冗長です。 –

答えて

1

どのように私はそれが主な背景をクリアしないで作るのですか?

できません。 Canvasは非透明(変更できません)されていますが、BufferStrategyには、ページの内容をペイントするページが2つ以上あります(ページのめくりを可能にします)。これを組み合わせると、親コンテナの背景を維持することが不可能になります。

代わりに、renderが呼び出されるたびに、ペイントするバッファのGraphicsコンテキストをクリアする必要があります。そうしないと、以前ペイントされていたものにペイントされます。

一つの技術は、「静的」コンテンツとBufferedImageを生成し、単に早く、[MCVE]または[ショート、自己含ま、修正例を投稿良好ヘルプの最初のバッファ