LibGdx 自定义磁贴 Class NullPointer 问题
LibGdx Custom Tile Class NullPointer issues
问题:
我已经开始尝试创建一个用于练习目的的自定义图块引擎。然而,一开始我就遇到了问题。如果有人可以阅读下面的所有内容并至少为我指出正确的方向,将不胜感激。
目标:
Tile class 在其构造函数中采用一个字符串作为参数,该参数由存储在 assets 文件夹中的 .PNG 文件的字符串数组给出。然后将其用于创建一个精灵,然后我尝试将其渲染到屏幕上。
故障排除完成:
1) 我已经使用断点单步执行代码,但没有发现任何在到达初始化它的代码后检出为 Null 的内容。
2) 我在 Google 上搜索了关于如何在 LibGdx 中创建 Sprites 和使用纹理的教程,据我所知我做的是正确的。
3) 我已经阅读了 LibGdx 文档,看看是否有任何我对这个过程不理解的地方,我在这里所做的似乎没有任何问题。
4) 我在这里阅读了不同的与 NullPointer 相关的问题,看看是否有任何我正在做的事情跳出来,但没有发现任何类似或接近我在这里所做的事情。
会发生什么:
这是日志的图片:
Log
这里是 Tile class 和 TileMap class:
平铺Class:
package com.tilemap.saphiric;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
/**
* Base Tile Class for TileMap generation
*/
public class Tile extends Sprite{
protected Texture texture;
protected Sprite sprite;
public Tile(String texture){
this.texture = new Texture(texture);
this.sprite = new Sprite(this.texture);
}
@Override
public void setPosition(float x, float y) {
super.setPosition(x, y);
}
@Override
public float getX() {
return super.getX();
}
@Override
public float getY() {
return super.getY();
}
}
TileMap Class:
package com.tilemap.saphiric;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
public class TileMap extends ApplicationAdapter {
private String[] mTextures = new String[4];
SpriteBatch batch;
Tile water;
@Override
public void create () {
// Runs setup method to create texture array
setup(1);
batch = new SpriteBatch();
water = new Tile(mTextures[3]);
System.out.print(String.valueOf(water.texture));
water.setPosition(Gdx.graphics.getWidth()/2 - water.getWidth()/2,
Gdx.graphics.getHeight()/2 - water.getHeight()/2);
}
@Override
public void render () {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(water, water.getX(), water.getY());
batch.end();
}
// This method recursively initializes the mTextures array with the necessary assets, called on creation
private int setup(int runCount){
// Initializes the texture array for tile creation
mTextures[0] = "dirt_tile.png";
mTextures[1] = "grass_tile.png";
mTextures[2] = "stone_tile.png";
mTextures[3] = "water_tile.png";
runCount --;
if(runCount == 0){
return 0;
}
return setup(runCount);
}
}
问题是您的 Tile
需要使用 Texture
初始化。引用自 Sprite
code documentation:
[the default constructor] Creates an uninitialized sprite. The sprite
will need a texture region and bounds set before it can be drawn.
换句话说,您的 Tile
构造函数需要调用它的超级 class、Sprite
,用 Texture
或 [=17] 初始化它=].这应该有效:
public Tile(String texture){
super(new Texture(texture));
}
问题: 我已经开始尝试创建一个用于练习目的的自定义图块引擎。然而,一开始我就遇到了问题。如果有人可以阅读下面的所有内容并至少为我指出正确的方向,将不胜感激。
目标: Tile class 在其构造函数中采用一个字符串作为参数,该参数由存储在 assets 文件夹中的 .PNG 文件的字符串数组给出。然后将其用于创建一个精灵,然后我尝试将其渲染到屏幕上。
故障排除完成:
1) 我已经使用断点单步执行代码,但没有发现任何在到达初始化它的代码后检出为 Null 的内容。
2) 我在 Google 上搜索了关于如何在 LibGdx 中创建 Sprites 和使用纹理的教程,据我所知我做的是正确的。
3) 我已经阅读了 LibGdx 文档,看看是否有任何我对这个过程不理解的地方,我在这里所做的似乎没有任何问题。
4) 我在这里阅读了不同的与 NullPointer 相关的问题,看看是否有任何我正在做的事情跳出来,但没有发现任何类似或接近我在这里所做的事情。
会发生什么: 这是日志的图片: Log
这里是 Tile class 和 TileMap class:
平铺Class:
package com.tilemap.saphiric;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
/**
* Base Tile Class for TileMap generation
*/
public class Tile extends Sprite{
protected Texture texture;
protected Sprite sprite;
public Tile(String texture){
this.texture = new Texture(texture);
this.sprite = new Sprite(this.texture);
}
@Override
public void setPosition(float x, float y) {
super.setPosition(x, y);
}
@Override
public float getX() {
return super.getX();
}
@Override
public float getY() {
return super.getY();
}
}
TileMap Class:
package com.tilemap.saphiric;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
public class TileMap extends ApplicationAdapter {
private String[] mTextures = new String[4];
SpriteBatch batch;
Tile water;
@Override
public void create () {
// Runs setup method to create texture array
setup(1);
batch = new SpriteBatch();
water = new Tile(mTextures[3]);
System.out.print(String.valueOf(water.texture));
water.setPosition(Gdx.graphics.getWidth()/2 - water.getWidth()/2,
Gdx.graphics.getHeight()/2 - water.getHeight()/2);
}
@Override
public void render () {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(water, water.getX(), water.getY());
batch.end();
}
// This method recursively initializes the mTextures array with the necessary assets, called on creation
private int setup(int runCount){
// Initializes the texture array for tile creation
mTextures[0] = "dirt_tile.png";
mTextures[1] = "grass_tile.png";
mTextures[2] = "stone_tile.png";
mTextures[3] = "water_tile.png";
runCount --;
if(runCount == 0){
return 0;
}
return setup(runCount);
}
}
问题是您的 Tile
需要使用 Texture
初始化。引用自 Sprite
code documentation:
[the default constructor] Creates an uninitialized sprite. The sprite will need a texture region and bounds set before it can be drawn.
换句话说,您的 Tile
构造函数需要调用它的超级 class、Sprite
,用 Texture
或 [=17] 初始化它=].这应该有效:
public Tile(String texture){
super(new Texture(texture));
}