使用精灵表+纹理+ BufferedImageLoader + Spawner的游戏图像错误

时间:2018-04-06 08:31:30

标签: java

我正在尝试使用我的spawner来创建cookie图像(图像工作),但我收到这些错误(在控制台中): 谢谢你

  

线程中的异常"线程-2" java.lang.NullPointerException

     
      
  • 在main.Spawn.tick(Spawn.java:37)

  •   
  • 在main.Game.tick(Game.java:135)

  •   
  • 在main.Game.run(Game.java:112)

  •   
  • 在java.lang.Thread.run(未知来源)

  •   

WINDOW

     package main;

  import java.awt.Canvas;

  import java.awt.Dimension;

 import javax.swing.JFrame;

public class Window extends Canvas {

private static final long serialVersionUID = -6357664197674207224L;

public Window(int width, int height, String title, Game game){
    JFrame frame = new JFrame(title);

    frame.setPreferredSize(new Dimension(Game.WIDTH,700));
    frame.setMaximumSize(new Dimension(Game.WIDTH,700));
    frame.setMinimumSize(new Dimension(Game.WIDTH,700));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.add(game);
    frame.setVisible(true);
    game.start();

}
}

GAME

package main;

 import java.awt.Canvas;
  import java.awt.Color;
  import java.awt.Graphics;
  import java.awt.Graphics2D;


  import java.awt.image.BufferStrategy;
  import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.Random;



    public class Game extends Canvas implements Runnable {

private static final long serialVersionUID = -2713820159854096116L;

public static  int WIDTH = 640, HEIGHT = 700 ; 

private Thread thread;
private boolean running = false;    

public static boolean paused = false;

private Random r;
private Handler handler;    
private HUD hud;
private Textures tex;

private Spawn spawner;


  private Cookie1 c;
  //Sprite Sheet
  private BufferedImage image = new 
     BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
   private SpriteSheet ss;
    private BufferedImage spriteSheet = null;  
   private BufferedImage Background = null;


public enum STATE{      
    Game                
};

public static STATE gameState = STATE.Game;



//temp  
public void init(){
    requestFocus();
    BufferedImageLoader loader = new BufferedImageLoader();
//try{
    spriteSheet = loader.loadImage("/SpriteSheet.png"); 
    Background = loader.loadImage("/Background.png");
    ss =new SpriteSheet(spriteSheet);
//}catch (IOException e){
//  e.printStackTrace();
//}
     tex = new Textures(this);      
    c = new Cookie1(200,200,null, handler, tex, this);
     handler = new Handler(tex);
}


public Game(){
hud = new HUD();    
//tex= new Textures(this);
spawner = new Spawn(handler,hud,this);

r = new Random();       
new Window(Game.WIDTH,Game.HEIGHT,"123",this);

}

public synchronized void start(){
    thread = new Thread(this);
    thread.start();
    running = true;

}

public synchronized void stop(){
    try {
        thread.join();
        running = false;

    }catch(Exception e){
        e.printStackTrace();
    }

}


public void run() {
    init();
    this.requestFocus();
    long LastTime = System.nanoTime();
    double amountOfTicks = 60.0;
    double ns = 1000000000 / amountOfTicks; 
    double delta = 0;
    long timer = System.currentTimeMillis();
    int frames = 0;
    while (running){
        long now = System.nanoTime();
        delta += (now - LastTime) /ns;
        LastTime = now;
        while (delta >= 1){
            tick();
            delta --;
        }
        if (running)
            render();
            frames ++;

            if (System.currentTimeMillis() - timer >1000){
                timer +=1000;
                        System.out.println("FPS: " + frames);
                        frames =0;
            }
        }
        stop();
    }

  private void tick() {


if (Game.gameState == STATE.Game)
{       
 handler.tick();
  hud.tick ();
   spawner.tick();  

          }
}
private void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null){
        this.createBufferStrategy(3);
        return;

    }
    Graphics g = bs.getDrawGraphics();
    Graphics2D g2d = (Graphics2D) g;
    //////////////////////////////////      
    /////////////////////////////////////// Draw here       
    g.setColor(Color.white);
    g.fillRect(0, 0, getWidth(), getHeight());
    g.drawImage(Background,0,0,640,195,null);               
    c.render(g);
    /////////////////////////////////////
    if (gameState == STATE.Game){   
        handler.render(g);
        hud.render(g);

    }
    ////////////////////////////////    
    g.dispose();
    bs.show();
}
 public static float clamp(float var,float min, float max){
       if (var >= max)
           return var = max;
           else if (var <= min)
               return var = min;
               else
                   return var;

 }
public static void main(String args[]){
    new Game();     
}

public BufferedImage getSpriteSheet(){
    return spriteSheet;
    }

 }

处理程序

package main;

  import java.awt.Graphics;
 import java.util.LinkedList;

 public class Handler {

LinkedList<GameObject> object =  new LinkedList<GameObject>();

 Textures tex;

public Handler(Textures tex) {
this.tex =tex;
}

    public void tick(){
        for (int i = 0; i <object.size() ; i++){
            GameObject tempObject = object.get(i);

            tempObject.tick();


        }
    }

  public void render(Graphics g){
    for (int i = 0; i <object.size() ; i++){
        GameObject tempObject = object.get(i);

        tempObject.render(g);
    }
 }


 public void addObject(GameObject object){
     this.object.add(object);
 }
 public void removeObject(GameObject object){
     this.object.remove(object);
 }


public ID getId() {
    // TODO Auto-generated method stub
    return null;
}

public Object getBounds() {
    // TODO Auto-generated method stub
    return null;
    }
}

SpriteSheet

package main;

  import java.awt.image.BufferedImage;

  public class SpriteSheet {


private BufferedImage image;

public SpriteSheet(BufferedImage image){

    this.image = image;
}

public BufferedImage grabImage(int col , int row, int width, int height){

    return image.getSubimage((col * 32 ) -32 , (row * 32) -32,width,  height);


}

 }

BufferedImageLoader

package main;

  import java.awt.image.BufferedImage;
  import java.io.IOException;

  import javax.imageio.ImageIO;

  public class BufferedImageLoader {


   private BufferedImage image;

  public BufferedImage loadImage(String path) {
    try {
        image  = ImageIO.read(getClass().getResource(path));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return image;

     }
 }

SPAWN

package main;


   import java.awt.Graphics;
    import java.util.Random;

公共类Spawn {

private Handler handler;

   private HUD hud;
   private Random r = new Random();
    private int timer = 100 ;
 Game game;
   public Spawn(Handler handler, HUD hud, Game game){
    this.handler = handler;
    this.hud = hud;
   this.game = game;
   }
    public void render(Graphics g){

    }

  public void tick(){       
         if (timer <=1000 )timer--;
         {
        if (timer <= 0 )
        {   

            for (int i =0; i <1 ; i++){
        int x = r.nextInt(Game.WIDTH-50);
        int y = r.nextInt(650); 
        handler.addObject(new Cookie1(x, y,ID.Cookie1, handler , null, game));

        }
            timer +=timer;
        }

        }
    }       
   }

游戏物体

package main;

  import java.awt.Graphics;
 import java.awt.Rectangle;

  public abstract class GameObject {

protected float x,y;
protected static ID id; 
protected float velX =0, velY = 0;
protected SpriteSheet ss;

//protected boolean falling = true;

public GameObject(float x,float y, ID id, Game game){

     this .x = x;
     this.y = y;
     this.id = id;       
     this.ss =ss;
}
public abstract void tick();
public abstract void render(Graphics g);
public abstract Rectangle getBounds();

public void setX(int x){
    this.x =x;      
}
public void setY(int y){
    this.y = y;
}

public float getX(){
    return x;
}
public float getY(){
    return y;
}

public void setId(ID id){
    this.id = id;
}
public ID getId(){
    return id;
  }

}

COOKIE1

package main;


      import java.awt.Graphics;
    import java.awt.Rectangle;


    public class Cookie1 extends GameObject {


private Handler handler;
public int cookies ;        
HUD hud;


private Textures tex;
public Cookie1(int x, int y, ID Cookie1, Handler handler,Textures tex, Game game) {
    super(x, y,id,game);    
    this.handler = handler;     
    this.tex = tex;

    }


public Rectangle getBounds(){
    return new Rectangle((int) x, (int)y,16,16);  
    }

public void tick() { 


    }


public void render(Graphics g) {
g.drawImage(tex.cookie1_image, (int)x, (int)y, null  );
  }


public boolean intersects(Object bounds) {
    // TODO Auto-generated method stub
    return false;
      }


  }

HUD     包主;

  import java.awt.Graphics;

  public class HUD{
 Handler handler;
public void tick(){     
   }

public void render(Graphics g){
    }
  }

ID

package main;

public enum ID {

    Cookie1, 
    Cookie2;    
}

纹理

       package main;

     import java.awt.image.BufferedImage;

     public class Textures {

public BufferedImage cookie1_image,cookie2_image;

private  SpriteSheet ss;

public Textures(Game game){
     ss=new SpriteSheet(game.getSpriteSheet());
     getTextures();
}
private void getTextures(){
    cookie1_image =ss.grabImage(1, 1, 32, 32);
    //cookie2_image =ss.grabImage(2, 1, 32, 32);
}
 }

1 个答案:

答案 0 :(得分:0)

查看Spawn类的第37行。唯一可以获得NullPointerException的是

handler.addObject(new Cookie1(x, y,ID.Cookie1, handler , null, game));

因为其他对象已正确初始化。

我认为这是第37行。

处理程序可能为null。如果你看看它来自哪里,在你的类Spawn中,它会在构造函数中初始化,由Game类调用,在Game的构造函数中。但它在Game的init()方法中初始化,此时尚未调用。