2016-08-07 6 views
0

Я следую учебнику по разработке 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.

+0

Прозрачность байт? –

ответ

0

Этот код получает цвет Int для входного сигнала 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% непрозрачности