# Java Pixel Malen



## Bw2801 (9. Apr 2012)

Hey Leute, ich habe mich mal daran gesetzt, in einem 800 * 600 Pixel großem Fenster ein 265 * 265 Pixel großes Feld mit zufällig gefärbten Pixeln zu rendern. Das ganze habe ich nach einem Tutorial auf Youtube gemacht.

Mein Problem dabei ist nur: Ich bekomme nur einen einzigen Pixel links oben in die Ecke des Fensters, keine 70225 (256 * 256) die eigentlich dort sein müssten (zumindest laut Video).

*Display Class*

```
package java3dgame;

import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java3dgame.graphics.*;
import javax.swing.JFrame;

public class Display extends Canvas implements Runnable{
    
    public static final int width = 800;
    public static final int height = 600;
    public static final String title = "Java3DGame Pre-Alpha 0.01";
    
    private Thread thread;
    private Screen screen;
    private BufferedImage img;
    private Render render;
    private boolean running = false;
    private int[] pixels;
    
    public Display(){
        screen = new Screen(width, height);
        img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
    }
    
    private void start(){
        if(running)
            return;
        running = true;
        thread = new Thread(this);
        thread.start();
    }
    
    public void stop(){
        if(!running)
            return;
        running = false;
        try{
            thread.join();
        } catch(Exception e){
            System.exit(0);
        }
    }
    
    public void run(){
        while(running){
            tick();
            render();
        }
    }
    
    private void tick(){
        
    }
    
    private void render(){
        BufferStrategy bs = this.getBufferStrategy();
        if(bs == null){
            createBufferStrategy(3);
            return;
        }
        
        screen.render();
        
        for(int i = 0; i < width*height; i++){
            pixels[i] = screen.pixels[i];
        }
        
        Graphics g = bs.getDrawGraphics();
        g.drawImage(img, 0, 0, width*20, height*20, null);
        g.dispose();
        bs.show();
    }
    
    public static void main(String[] args){
        Display game = new Display();
        JFrame frame = new JFrame();
        frame.add(game);
        frame.pack();
        frame.setTitle(title);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(width, height);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true);
        
        game.start();
    }
}
```

*Render Class*

```
package java3dgame.graphics;

public class Render {
    
    public final int width;
    public final int height;
    public final int[] pixels;
    
    public Render(int width, int height){
        this.width = width;
        this.height = height;
        pixels = new int[width * height];
    }
    
    public void draw(Render render, int xOffset, int yOffset){
        for(int y = 0; y < render.height; y++){
            int yPix = y * yOffset;
            for(int x = 0; x < render.width; x++){
                int xPix = x * xOffset;
                
                pixels[yPix+xPix*width] = render.pixels[x+y*render.width];
            }
        }
    }
}
```

*Screen Class*

```
package java3dgame.graphics;

import java.util.Random;

public class Screen extends Render{
    
    private Render test;
    
    public Screen(int width, int height){
        super(width, height);
        Random random = new Random();
        test = new Render(256, 256);
        for(int i=0; i < 256*256; i++){
            test.pixels[i] = random.nextInt();
        }
    }
    
    public void render(){
        draw(test, 0, 0);
    }
}
```

Ich weiß nicht, wo hier der Fehler liegen könnte,
hoffentlich könnt ihr mir helfen!

Danke schonmal im vorraus,
Bw2801


----------



## Marco13 (9. Apr 2012)

Beschreib' ggf. nochmal genauer, was da gemacht werden soll. Im Moment sind xOffset und yOffset beide 0, d.h. in der draw-Methode setzt er immer nur den Pixel bei (0,0)... mit
draw(test, 1, 1);
geht es erstmal, aber bei
draw(test, 2, 2);
kommt halt ... "Mist"?... raus... der offset bewirkt nicht das, was man dem Namen nach erwarten würde...


----------



## Bw2801 (9. Apr 2012)

Danke, mit "draw(test, 1, 1);" hat es wunderbar geklappt, genau das sollte rauskommen. Danke nochmal!


----------



## Bw2801 (9. Apr 2012)

Oh, doch nicht.
Ich musste in der Draw methode:

```
public void draw(Render render, int xOffset, int yOffset){
        for(int y = 0; y < render.height; y++){
            int yPix = y * yOffset;
            
            for(int x = 0; x < render.width; x++){
                int xPix = x * xOffset;
                
                pixels[yPix+xPix*width] = render.pixels[x+y*render.width];
            }
        }
    }
```

Die mal-Zeichen in

```
int yPix = y * yOffset;
```
und

```
int xPix = x * xOffset;
```
durch ein "+" ersetzen.

Trotzdem danke für die Hilfe.


----------

