Ich habe eine Lernprogramm-Serie auf Youtube über ein Spiel in Java und an einer Stelle in der Anleitung das Programm musste die RGB lesen Werte von jedem einzelnen Pixel in einem 64x64 PNG-Bild und erstellen Instanzen von Klassen entsprechend, aber als ich den Code fertiggestellt habe, war alles, was ich bekam, ein leerer Bildschirm. Das Bild wurde in Paint.net erstellt und ich benutze Eclipse Neon 2. Vielen Dank im Voraus! :)Warum kann ich nicht lesen die RGB-Werte eines PNG-Bild in Java und Eclipse
Hier ist mein Code:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
public class Game extends Canvas implements Runnable{
private static final long serialVersionUID = 1L;
private boolean isRunning = false;
private Thread thread;
private Handler handler;
private SpriteSheet ss;
private BufferedImage level = null;
private BufferedImage sprite_sheet = null;
private BufferedImage floor = null;
public Game(){
new Window(1000, 563, "Wizard Game", this);
start();
handler = new Handler();
this.addKeyListener(new KeyInput(handler));
BufferedImageLoader loader = new BufferedImageLoader();
level = loader.LoadImage("wizard_level.png");
loadLevel(level);
sprite_sheet = loader.LoadImage("/sprite_sheet.png");
floor = ss.grabImage(4, 2, 32, 32);
}
private void start(){
isRunning = true;
thread = new Thread(this);
thread.start();
}
private void stop(){
isRunning = false;
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void run(){
this.requestFocus();
long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000/amountOfTicks;
double delta = 0;
long timer = System.currentTimeMillis();
int frames = 60;
while(isRunning){
long now = System.nanoTime();
delta += (now - lastTime)/ns;
lastTime = now;
while(delta >= 1){
tick();
delta --;
}
if(isRunning)
render();
frames ++;
if(System.currentTimeMillis() - timer > 1000){
timer += 1000;
System.out.println("FPS: " + frames);
frames = 0;
}
}
stop();
}
public void tick(){
handler.tick();
}
public void render(){
BufferStrategy bs = this.getBufferStrategy();
if(bs == null){
this.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
for(int xx = 0; xx < 30*72; xx += 32){
for(int yy = 0; yy < 30*72; yy += 32){
g.drawImage(floor, xx, yy, null);
}
}
handler.render(g);
g.dispose();
bs.show();
}
private void loadLevel(BufferedImage image){
int w = image.getWidth();
int h = image.getHeight();
for(int xx = 0; xx > w; xx++){
for(int yy = 0; yy < h; yy++){
int pixel = image.getRGB(xx, yy);
int red = (pixel >> 16) & 0xff;
int blue = (pixel >> 8) & 0xff;
int green = (pixel) & 0xff;
if(red == 255)
handler.addObject(new Block(xx*32, yy*32, ID.Block, ss));
if(blue == 255)
handler.addObject(new Wizard(xx*32, yy*32, ID.Player, handler, ss));
}
}
}
public static void main(String args[]){
new Game();
}
}
Was ist 'Handler'? – MadProgrammer
Die Frage ist zu weit für SO - es hat zu viele Klassen und externe Ressourcen benötigt, um erfolgreich zu debuggen. Hier ist eine gute Gelegenheit für Sie, Code zu debuggen. Beginnen Sie mit 'System.out.println' (oder einer entsprechenden Logger-API), um den Fluss durch die App zu verfolgen und verschiedene Zustände zu überprüfen. Wenn dies nicht hilft, verwenden Sie den Debugger von Eclipse und gehen Sie durch den Code. Sie müssen besser verstehen, was der Code zu erreichen versucht, anstatt einfach das Tutorial – MadProgrammer
zu kopieren. Ich kann sehen, dass in loadLevel() Objekte erstellt werden, wenn rot oder blau 255 sind. Vielleicht hat das Bild keine Pixel Das sind eigentlich diese Farben. Druckanweisungen in dieser Schleife zu setzen, um zu sehen, welche tatsächlichen Farben dort sind, können für Sie nützlich sein. – slipperyseal