私は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;
}
}
}
私が見てチェックすることで、 "デバッグ" を試してみましたGame
とScreen
クラスの私の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を作成しました。
透明バイトとマゼンタの色を描画している疑いがあるため、カラーint型を取得しますか? –