Я следую учебнику по разработке Java-игр, и я попал в блокпост, потому что не могу понять, что не так с моим кодом. Я должен сделать новое изображение, изменив каждый пиксель буферизованного изображения на желаемый цвет. Затем я копирую этот массив в массив в моем классе 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;
}
}
}
Я пытался "отладки", проверяя, чтобы увидеть если оба моих массива pixels
в Game
и класс Screen
загружаются цветом пурпурного цвета. Я просто сделал:
for (int i = 0; i < pixels.length; i++) {
pixels[i] = screen.pixels[i];
System.out.println(pixels[i]);
}
, и я также пытался:
for (int i = 0; i < pixels.length; i++) {
pixels[i] = screen.pixels[i];
System.out.println(screen.pixels[i]);
}
В обоих случаях десятичное представление пурпурного (FF00FF
в Hex) печатается, пока я не закрыть окно.
Еще одна вещь, которую я пробовал, - это использовать метод image.setRGB
, чтобы изменить цвет изображения.
Я добавил эту линию
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();
}
пурпурная точка появилась в моем кадре, и я также в состоянии превратить весь кадр в твердый пурпурный цвета, изменив метод render
в классе Screen
. Теперь мне интересно, почему мой «оригинальный» код не работает. Насколько я понимаю, метод setRGB
намного медленнее, чем я изначально планировал использовать для рендеринга изображений, поэтому я не хочу просто сдаваться и соглашаться с использованием setRGB
.
Я провел практически весь день, просматривая все правописания в своем коде, убедившись, что вложенные в петли классы Screen
верны и т. Д. Я здесь в затруднении. Я не понимаю, в чем проблема.
Если фрагментов кода, которые я включил, недостаточно, я создал Gist моего кода целиком here.
Прозрачность байт? –