2017-11-18 8 views
0

2015年11月にリリースされたガイドに従って、私はこの時点でコードをそのままコピーしましたが、それでも私のためには機能しません。何かが廃止されましたか?JavaでBufferStrategyを使用しているときに黒い線を避ける方法

私は3つのバッファを持っています(1,2,3と呼んでください)。 2と3が画面に描画されると、画面の上部と左側に黒い線が表示されます。この同じコードは2つのバッファでうまく動作します。

バグ映像:https://gfycat.com/gifs/detail/GraveCompetentArmyworm

package field; 

import javax.swing.JFrame; 

import java.awt.*; 
import java.awt.image.BufferStrategy; 

public class Main extends JFrame{ 

    private Canvas canvas=new Canvas(); 

    public Main() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     setBounds(0,0,1000,1000); 

     setLocationRelativeTo(null); 

     add(canvas); 
     setVisible(true); 

     canvas.createBufferStrategy(3); 
     BufferStrategy buffert = canvas.getBufferStrategy(); 

     int p=0; 
     int ap=0; 
     while(p<1000) { 
      if (ap==100){ 
       p++; 
       ap=0; 
      } 
      ap++; 
      buffert=canvas.getBufferStrategy(); 
      Graphics g = buffert.getDrawGraphics(); 
      super.paint(g); 
      g.setColor(Color.GREEN); 

      g.fillOval(p+100, 200, 50, 50); 

      buffert.show(); 
     } 
    } 

// public void paint(Graphics graphics) { 
//  super.paint(graphics); 
//  graphics.setColor(Color.RED); 
//  graphics.fillOval(100, 100, 100, 100); 
//  
// } 



    public static void main(String[] args){ 


     new Main(); 




    } 

} 
+1

である。super.paint(g);が最初の間違いである。自分でバッファをクリアしてください。 – MadProgrammer

+0

私にしようと明かしてください。 Canvasはフレームの子であり、フレームの境界線によってオフセットされています。super.paintを呼び出すと、フレームをGraphicsにペイントするように要求します。黒いバーは、実際には通常、ウィンドウの装飾で覆われている領域です – MadProgrammer

+0

恐ろしい!私はsuper.paint(g)をcanvas.paint(g)に変更しました。今は期待どおりに動作しています。 –

答えて

1

あなたがthe JavaDocs for BufferStrategyFull-Screen Exclusive Mode APIを読んで行く必要があり、BufferStrategy

上の重要なチュートリアルと例の数BufferStrategyは「ページフリッピング」を実行するための手段であり、通常の塗装システムとは独立しています。これにより、ペインティングプロセスを「アクティブ」に制御できます。各バッファは画面から更新され、準備ができたら画面にプッシュされます。

これは一般的に、コンポーネント自身の塗装システムには関係しないため、回避することを意図しています。

これはまたはcanvas.paintsuper.paint(g)を呼んではいけないことを意味します。実際には、原則としてpaintを手動で呼び出すべきではありません。

バッファを更新するたびに、バッファを準備する必要があります。これは典型的には、いくつかのベースカラーとそれを埋める意味

ので、のJavaDocの例をもとに、あなたは

// Check the capabilities of the GraphicsConfiguration 
... 

// Create our component 
Window w = new Window(gc); 

// Show our window 
w.setVisible(true); 

// Create a general double-buffering strategy 
w.createBufferStrategy(2); 
BufferStrategy strategy = w.getBufferStrategy(); 

// Main loop 
while (!done) { 
    // Prepare for rendering the next frame 
    // ... 

    // Render single frame 
    do { 
     // The following loop ensures that the contents of the drawing buffer 
     // are consistent in case the underlying surface was recreated 
     do { 
      // Get a new graphics context every time through the loop 

      // Determine the current width and height of the 
      // output 
      int width = ...; 
      int height = ...l 
      // to make sure the strategy is validated 
      Graphics graphics = strategy.getDrawGraphics(); 
      graphics.setColor(Color.WHITE); 
      graphics.fillRect(0, 0, width, height);  
      // Render to graphics 
      // ... 

      // Dispose the graphics 
      graphics.dispose(); 

      // Repeat the rendering if the drawing buffer contents 
      // were restored 
     } while (strategy.contentsRestored()); 

     // Display the buffer 
     strategy.show(); 

     // Repeat the rendering if the drawing buffer was lost 
    } while (strategy.contentsLost()); 
} 

// Dispose the window 
w.setVisible(false); 
w.dispose(); 

は、個人的に、私はとしてCanvasを使用することを好むだろう...のような何かを行うことができますより再利用可能なソリューションを提供し、次元を決定する方が簡単なので、基底は