【问题标题】:Libgdx NullPointerExceptionLibgdx NullPointerException
【发布时间】:2013-12-29 09:51:55
【问题描述】:

我正在尝试在 libgdx 中使用精灵表制作一个简单的动画,一个正在移动双腿的小人。这是代码:

package com.pro.schoolrun;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;

public class SchoolRun implements ApplicationListener {
    Texture player;
    TextureRegion[] regions;
    SpriteBatch batch;
    OrthographicCamera camera;
    int i;

    @Override
    public void create() {

        i = 0;

        player = new Texture(Gdx.files.internal("data/spritesheet.png"));
        regions[0] = new TextureRegion(player, 0, 0, player.getWidth() / 4,
                player.getHeight() / 2);
        regions[1] = new TextureRegion(player, 64, 0, player.getWidth() / 4,
                player.getHeight() / 2);
        regions[2] = new TextureRegion(player, 128, 0, player.getWidth() / 4,
                player.getHeight() / 2);
        regions[3] = new TextureRegion(player, 192, 0, player.getWidth() / 4,
                player.getHeight() / 2);
        regions[4] = new TextureRegion(player, 0, 128, player.getWidth() / 4,
                player.getHeight() / 2);
        regions[5] = new TextureRegion(player, 64, 128, player.getWidth() / 4,
                player.getHeight() / 2);
        regions[6] = new TextureRegion(player, 128, 128, player.getWidth() / 4,
                player.getHeight() / 2);
        regions[7] = new TextureRegion(player, 192, 128, player.getWidth() / 4,
                player.getHeight() / 2);

        camera = new OrthographicCamera();
        camera.setToOrtho(false, 800, 400);
        batch = new SpriteBatch();

    }

    @Override
    public void dispose() {
        player.dispose();
        batch.dispose();

    }

    @Override
    public void render() {

        Gdx.gl.glClearColor(0, 0, 0.2f, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        camera.update();

        batch.setProjectionMatrix(camera.combined);

        while (true) {

            batch.begin();
            if (i > 7) {
                i = -1;
                i++;
            } else {
                i++;
            }

            batch.draw(regions[i], Gdx.graphics.getWidth() / 2,
                    Gdx.graphics.getHeight() / 2);
           batch.end();
        }

    }

    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }
}

但是当我在 android 上运行它时,它在第 24 行(在区域 [0])给了我一个 NullPointer 异常。这是 MainActivity 类:

package com.pro.schoolrun;

import android.os.Bundle;

import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;

public class MainActivity extends AndroidApplication {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
        cfg.useGL20 = true;
        cfg.useAccelerometer=false;
        cfg.useCompass = false;


        initialize(new SchoolRun(), cfg);
    }
}

【问题讨论】:

  • 需要注意的一点是,您的渲染方法中不需要 while 循环。它会被自动调用。

标签: java android animation libgdx


【解决方案1】:

你永远不会初始化 regions 数组:

TextureRegion[] regions;

应该是这样的

TextureRegion[] regions = new TextureRegion[8];

【讨论】:

    【解决方案2】:
    public void create() {
    
    region=new TextureRegion[8];
    }
    

    这应该可以解决问题

    【讨论】:

    • 很好,这解决了问题!现在我必须找出为什么我的模拟器的屏幕是空白的!
    【解决方案3】:

    NullPointer 异常意味着您正在尝试使用尚未初始化的东西。对象、数组和变量必须先初始化/赋值才能使用。

    在您的情况下,您正在尝试使用名为“regions”的 TextureRegion 数组,但您尚未初始化。您可以像这样初始化数组:

    region = new TextureRegion[8];
    

    其中 8 是数组的大小。 必须在使用 region 之前调用此语句。

    【讨论】:

      【解决方案4】:

      当图像文件为空时,会发生 NullPointerException。 (表示该目录下没有找到图片文件。)

      确保您的图片位于正确的位置

      在您的情况下,您的图片应位于

      “包含您的项目的目录”/SchoolRun/android/assets/data

      或者您将代码更改为

              player = new Texture(Gdx.files.internal("spritesheet.png"));
      

      希望你成功:)

      【讨论】:

      • 我不同意。找不到文件时,LibGdx 会抛出 com.badlogic.gdx.utils.GdxRuntimeException。当您使用尚未初始化的东西时,会引发 NullPointerException。
      猜你喜欢
      • 2015-01-30
      • 2014-05-10
      • 1970-01-01
      • 2023-03-31
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多