2016-08-07 3 views
0

私はJava Game開発チュートリアルに従っています。コードに何が間違っているのかわからないので、私はロードブロッキングを打ちました。バッファリングされた画像の各ピクセルを、私が望む色に変更することによって、新しい画像をレンダリングするはずです。次に、配列を配列Gameにコピーして、レンダリングしたイメージを描画します。関連するコードはすぐ下にあります。コードスニペットの直後に私が試したことについて話し合う。BufferedImageオブジェクトのすべてのピクセルをマゼンタ色のものに置き換えた後に、黒いイメージが表示されるのはなぜですか?

このコードスニペットは、私のGameクラスからです:

private Screen screen; 
private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

// Converts image into array of integers 
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); 

public Game() { 
    Dimension size = new Dimension(width * scale, height * scale); 
    setPreferredSize(size); 
    screen = new Screen(width, height); 
    frame = new JFrame(); 
    pixels = new int[width * height]; 
} 


// Displays images to the screen 
public void render() { 
    BufferStrategy bs = getBufferStrategy(); 

    // Checks if the buffer strategy exists. If it doesn't create a triple buffer strategy 
    if(bs == null) { 

     // Triple buffering 
     createBufferStrategy(3); 
     return; 
    } 
    screen.render(); 

    // Copies array in Screen class to pixels array in (this) class 
    for (int i = 0; i < pixels.length; i++) { 
     pixels[i] = screen.pixels[i]; 
    } 

    // Must be in chronological order 
    Graphics g = bs.getDrawGraphics(); 
    g.setColor(Color.CYAN); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null); 
    g.dispose(); 

    // Display next available buffer 
    bs.show(); 
} 

このコードスニペットは、私のScreenクラスからです:

private int width; 
private int height; 
public int[] pixels; 

public Screen(int width, int height) { 
    this.width = width; 
    this.height = height; 

    // Size of the pixels array reserves one element for each pixel 
    pixels = new int[width * height]; 
} 

public void render() { 
    for (int y = 0; y < height; y++) { 
     for (int x = 0; x < width; x++) { 
      pixels[x + y * width] = 0xff00ff; 
     } 
    } 
} 

私が見てチェックすることで、 "デバッグ" を試してみましたGameScreenクラスの私のpixels配列の両方がマゼンタ色でロードされている場合。

for (int i = 0; i < pixels.length; i++) { 
      pixels[i] = screen.pixels[i]; 
      System.out.println(pixels[i]); 
     } 

およびIも試した:私は単にた両方の場合において

for (int i = 0; i < pixels.length; i++) { 
      pixels[i] = screen.pixels[i]; 
      System.out.println(screen.pixels[i]); 
     } 

Iウィンドウを閉じるまで、マゼンタ(Hex中FF00FF)の10進表現は、プリントアウトされます。

私が試みたもう一つのことは、画像の色を変更するためにimage.setRGBメソッドを使用することです。次のように

私はrenderメソッドにこのライン

image.setRGB(20, 20, 16711935);を追加しました:

// Displays images to the screen 
public void render() { 
    BufferStrategy bs = getBufferStrategy(); 

    // Checks if the buffer strategy exists. If it doesn't create a triple buffer strategy 
    if(bs == null) { 

     // Triple buffering 
     createBufferStrategy(3); 
     return; 
    } 
    screen.render(); 

    // Copies array in Screen class to pixels array in Game (this) class 
    /* for (int i = 0; i < pixels.length; i++) { 
     pixels[i] = screen.pixels[i]; 
    } 
    */ 

    // Must be in chronological order 
    Graphics g = bs.getDrawGraphics(); 
    g.setColor(Color.CYAN); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    image.setRGB(20, 20, 16711935); 
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null); 
    g.dispose(); 

    // Display next available buffer 
    bs.show(); 
} 

マゼンタのドットが私のフレームに現れた、と私はまた、固体マゼンタにフレーム全体をオンにすることができますよScreenクラスのrenderメソッドを変更してください。さて、私はなぜ私の "元の"コードが動作していないのだろうかと思います。私が理解しているところでは、setRGBメソッドは、イメージのレンダリングに元々意図していたよりもはるかに遅いので、あきらめてsetRGBを使って解決したいとは思いません。

Screenクラスのネストされたforループが正しいことを確認しながら、コード内のすべてのスペルを一貫して過ごしました。私はここで紛失しています。私は問題が何かを理解していない。

私が含まれているコードスニペットでは十分ではない場合、私は自分のコードの全体をhereというGistを作成しました。

+0

透明バイトとマゼンタの色を描画している疑いがあるため、カラーint型を取得しますか? –

答えて

0

このコードは、入力RGB色

public static int getIRGB(int Red, int Green, int Blue){ 
    Red = (Red << 16) & 0x00FF0000; //Shift red 16-bits and mask out other stuff 
    Green = (Green << 8) & 0x0000FF00; //Shift Green 8-bits and mask out other stuff 
    Blue = Blue & 0x000000FF; //Mask out anything not blue. 

    return 0xFF000000 | Red | Green | Blue; //0xFF000000 for 100% Alpha. Bitwise OR everything together. 
} 

私はあなたが0%の不透明度

関連する問題