2017-10-23 3 views
0

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(); 

    } 

} 
+0

Was ist 'Handler'? – MadProgrammer

+1

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

+0

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

Antwort

2

Die folgende for-Schleife wird nicht ausgeführt ..

for(int xx = 0; xx > w; xx++){ 

wird es Schleife während xx > w welche immer falsch sein (xx beginnt als 0 und das Bild hat eine positive Breite)

wie in der yy Schleife innerhalb, die korrekt ist, ändern Sie die größer als auf weniger als

for(int xx = 0; xx < w; xx++){ 

, wenn Sie noch nicht die erwarteten Ergebnisse zu werden, melden Sie sich die aktuellen Werte von red und blue zu sehen, welche Farbelemente tatsächlich im Bild sind. Objekte werden nur erstellt, wenn die roten und blauen Komponenten eines Pixels 255

Verwandte Themen