我正在尝试使用我的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);
}
}
答案 0 :(得分:0)
查看Spawn类的第37行。唯一可以获得NullPointerException的是
handler.addObject(new Cookie1(x, y,ID.Cookie1, handler , null, game));
因为其他对象已正确初始化。
我认为这是第37行。
处理程序可能为null。如果你看看它来自哪里,在你的类Spawn中,它会在构造函数中初始化,由Game类调用,在Game的构造函数中。但它在Game的init()方法中初始化,此时尚未调用。