简体   繁体   English

Java NullPointerException碰撞是源,但不确定为什么

[英]Java NullPointerException Collision is the source, but not sure Why

I have tried running the code without the collision, and it works fine. 我试过没有碰撞运行代码,它工作正常。 But with it, I get a NullPointerException. 但有了它,我得到一个NullPointerException。 The root of the problem has something to do with 问题的根源与此有关

blocked[xAxis][yAxis] = true;

edit: Sorry for not providing the traces earlier. 编辑:很抱歉没有提供早期的跟踪。

console: 安慰:

Wed Dec 21 20:32:52 PST 2011 INFO:Slick Build #274
Wed Dec 21 20:32:52 PST 2011 INFO:LWJGL Version: 2.8.2
Wed Dec 21 20:32:52 PST 2011 INFO:OriginalDisplayMode: 1440 x 900 x 32 @60Hz
Wed Dec 21 20:32:52 PST 2011 INFO:TargetDisplayMode: 800 x 600 x 0 @0Hz
Wed Dec 21 20:32:53 PST 2011 INFO:Starting display 800x600
Wed Dec 21 20:32:53 PST 2011 INFO:Use Java PNG Loader = true
Loading: net.java.games.input.DirectAndRawInputEnvironmentPlugin
Wed Dec 21 20:32:54 PST 2011 INFO:Found 0 controllers
Exception in thread "main" java.lang.NullPointerException
at RPG.Main.init(Main.java:41)
at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:390)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:314)
at RPG.Main.main(Main.java:102)

Properties of the TiledMap TiledMap的属性

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">
<map version="1.0" orientation="orthogonal" width="10" height="10" tilewidth="32"                   <tileheight="32">
<tileset name="wall" firstgid="1" tilewidth="32" tileheight="32">
<image source="wall.png"/>
<tile id="0">
<properties>
<property name="blocked" value="true"/>
</properties>
</tile>
</tileset>
<tileset name="grass" firstgid="2" tilewidth="32" tileheight="32">
<image source="grass.png"/>
</tileset>
<layer name="Layer 0" width="10" height="10">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAGNkYGBgJBIzEcCUqBvsYtTwLzEYAHHwHBmQAQAA
</data>
</layer>
</map>

full code. 完整代码。

public class Main extends BasicGame {

Image player = null;
Image land = null;

private float playerX = 32f;
private float playerY = 32f;
private static final int SIZE = 32;

private boolean[][] blocked;

private TiledMap map;


public Main()
{
    super("Classic");
}

@Override
public void init(GameContainer gc)
        throws SlickException 
{
    player = new Image("RPG/player.png");
    map = new TiledMap("RPG/Map.tmx");

    for (int xAxis=0;xAxis<map.getWidth(); xAxis++)
    {
         for (int yAxis=0;yAxis<map.getHeight(); yAxis++)
         {
             int tileID = map.getTileId(xAxis, yAxis, 0);
             String value = map.getTileProperty(tileID, "blocked", "false");
             if ("true".equals(value))
             {
                 blocked[xAxis][yAxis] = true;
             }
         }
     }

}

@Override
public void update(GameContainer gc, int delta)
        throws SlickException
{
    Input input = gc.getInput();

    if (input.isKeyDown(Input.KEY_LEFT)) {
        if (!isBlocked(playerX, playerY - delta * 0.1f))
        {
        playerX-= delta * 0.1f;
        }
    }
    if (input.isKeyDown(Input.KEY_RIGHT)) {
        if (!isBlocked(playerX, playerY - delta * 0.1f))
        {
        playerX+= delta * 0.1f;
        }
    }
    if (input.isKeyDown(Input.KEY_UP)) {
        if (!isBlocked(playerX, playerY - delta * 0.1f))
        {
        playerY-= delta * 0.1f;
        }
    }
    if (input.isKeyDown(Input.KEY_DOWN)) {
        if (!isBlocked(playerX, playerY - delta * 0.1f))
        {
        playerY+= delta * 0.1f;
        }
    }

}

public void render(GameContainer gc, Graphics g)
        throws SlickException
{
    map.render(0, 0);

    player.draw(playerX, playerY);

}

private boolean isBlocked(float playerX, float playerY)
{
    int xBlock = (int)playerX / SIZE;
    int yBlock = (int)playerY / SIZE;
    return blocked[xBlock][yBlock];
}

public static void main(String[] args)
        throws SlickException
{
     AppGameContainer app = new AppGameContainer( new Main() );
     app.setDisplayMode(800, 600, false);
     app.start();
   }

}

blocked is never created. 从未创建blocked You need to say somewhere: 你需要在某个地方说:

blocked = new boolean[xsize][ysize];

where xsize and ysize are set appropriately. 其中xsize和ysize设置得恰当。

Because you haven't done this, blocked is null instead of an array. 因为您还没有这样做,所以blockednull而不是数组。 That's why you're getting the exception when you try to assign something to an element in the array. 这就是为什么当您尝试将某些内容分配给数组中的元素时,您将获得异常。

In your case, you could add 在你的情况下,你可以添加

blocked = new boolean[map.getWidth()][map.getHeight()];

to the top of your init() function. init()函数的顶部。

You didn't initialize the array 您没有初始化数组

private boolean[][] blocked;

that's why you got a NullPointerException in blocked[xAxis][yAxis] = true; 这就是你在blocked[xAxis][yAxis] = true;得到NullPointerException的原因blocked[xAxis][yAxis] = true;

我没有看到被阻止的2D数组在任何地方初始化,你需要将其初始化为地图的大小

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM