2016-11-23 3 views
0

У меня есть ошибка в отношении Null Pointer Exception и я не могу найти точное местоположение ошибки в моей программе. Я искал вероятные решения в Интернете, но я не считаю их полезными. Я знаю, что такое Null Pointer Exception, но я не могу определить, что пошло не так в моем коде. Любая помощь будет оценена, спасибо.Исключено исключение Null Pointer

Вот мой код:

LevelOneScreen.java

public class LevelOneScreen implements Screen { 

    private final ThumbChase app; 
    WalkAnimate walkAnimate; 
    private Stage stage; 
    private Image levelOneImage; 
    private Image holdStartImage; 
    public Image walkRightImage; 
    public Image walkLeftImage; 
    public float deltaTime = Gdx.graphics.getDeltaTime(); 


    public LevelOneScreen(final ThumbChase app){ 
     this.app = app; 
     this.stage = new Stage(new StretchViewport(app.screenWidth,app.screenHeight , app.camera)); 

    } 
    @Override 
    public void show() { 

     Gdx.input.setInputProcessor(stage); 
     walkAnimate = new WalkAnimate(); 

     levelOneBackground(); 
     holdStart(); 
     ninjaWalk();       ==>ERROR1:LevelOneScreen.java:54 


    } 



    public void holdStart(){ 
     Texture holdStartTexture = new Texture("HoldStart.png"); 
     holdStartImage = new Image(holdStartTexture); 
     float holdStartImageW = holdStartImage.getWidth(); 
     float holdStartImageH = holdStartImage.getHeight(); 
     float holdStartImgWidth = app.screenWidth*0.8f; 
     float holdStartImgHeight = holdStartImgWidth *(holdStartImageH/holdStartImageW); 
     holdStartImage.isTouchable(); 
     holdStartImage.setSize(holdStartImgWidth,holdStartImgHeight); 
     holdStartImage.setPosition(stage.getWidth()/2-holdStartImgWidth/2,stage.getHeight()/2-holdStartImgHeight/2); 
     stage.addActor(holdStartImage); 
     holdStartImage.addListener(new ActorGestureListener(){ 
      public void touchDown (InputEvent event, float x, float y, int pointer, int button){ 
       holdStartImage.setVisible(false); 
      }; 
     }); 


     } 


    public void levelOneBackground(){ 
     Texture levelOneTexture = new Texture("BGBlue Resize.png"); 
     levelOneImage = new Image(levelOneTexture); 
     levelOneImage.setSize(app.screenWidth,app.screenHeight); 
     levelOneImage.setPosition(0,0); 
     stage.addActor(levelOneImage); 
     levelOneImage.addListener(new ActorGestureListener(){ 
      public void touchDown (InputEvent event, float x, float y, int pointer, int button){ 
       holdStartImage.setVisible(false); 
      }; 
     }); 
    } 
    public void ninjaWalk(){ 

ERROR2==> TextureRegion ninjaWalkRight = new TextureRegion(walkAnimate.getCurrentFrameRight()); 
      TextureRegion ninjaWalkLeft = new TextureRegion(walkAnimate.getCurrentFrameLeft()); 
      walkRightImage = new Image(ninjaWalkRight); 
      walkLeftImage = new Image(ninjaWalkLeft); 
      float walkImageW = walkRightImage.getWidth(); 
      float walkImageH = walkRightImage.getHeight(); 
      float walkImageWidth = app.screenWidth*0.15f; 
      float walkImageHeight = walkImageWidth*(walkImageH/walkImageW); 
      walkLeftImage.isTouchable(); 
      walkRightImage.isTouchable(); 
      walkRightImage.setSize(walkImageWidth,walkImageHeight); 
      walkLeftImage.setSize(walkImageWidth,walkImageHeight); 
      walkRightImage.setPosition(stage.getWidth()/2-walkImageWidth/2,0); 
      walkLeftImage.setPosition(stage.getWidth()/2-walkImageWidth/2,0); 
      walkLeftImage.addAction(moveBy(3f,3f,3f)); 
      stage.addActor(walkLeftImage); 


     } 

     @Override 
     public void render(float delta) { 

      Gdx.gl.glClearColor(0, 0, 0, 1); 
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
      walkAnimate.update(deltaTime); 
      update(delta); 
     } 

     public void update(float delta){ 
      stage.act(delta); 
      stage.draw(); 
      app.batch.begin(); 

      app.batch.end(); 
     } 

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

     } 

     @Override 
     public void pause() { 

     } 

     @Override 
     public void resume() { 

     } 

     @Override 
     public void hide() { 

     } 

     @Override 
     public void dispose() { 
      stage.dispose(); 

     } 
    } 

WalkAnimate.java

public class WalkAnimate { 

     public ThumbChase app; 
     public Stage stage; 


     private Animation walkAnimationRight; 
     private Animation walkAnimationLeft; 
     private Texture walkSheetRight; 
     private Texture walkSheetLeft; 
     private TextureRegion[] walkFramesRight; 
     private TextureRegion[] walkFramesLeft; 
     private TextureRegion currentFrameRight; 
     private TextureRegion currentFrameLeft; 
     private float stateTime; 
     private Rectangle bound; //used for positioning and collision detection 
     private static final int FRAME_COLS_WALK = 3; 
     private static final int FRAME_ROWS_WALK= 2; 
     private float screenWidth = Gdx.graphics.getWidth(); 
     private float screenHeight = Gdx.graphics.getHeight(); 
     public float currentFrameWidth = (float)(screenHeight*0.15); 
     public float currentFrameHeight = (float)(screenHeight*0.15); 
     public float walkSheetWidth; 
     public float walkSheetHeight; 



     public WalkAnimate() { 

      walkSheetRight = new Texture("ninjaWalkRight.png"); 
      walkSheetWidth = walkSheetRight.getWidth(); 
      walkSheetHeight = walkSheetRight.getWidth(); 
      TextureRegion[][] tmp = TextureRegion.split(walkSheetRight, (int) walkSheetRight.getWidth()/FRAME_COLS_WALK, (int) walkSheetRight.getHeight()/FRAME_ROWS_WALK); 
      walkFramesRight = new TextureRegion[FRAME_COLS_WALK * FRAME_ROWS_WALK]; 
      int index = 0 ; 
      for (int i = 0; i < FRAME_ROWS_WALK; i++) { 
       for (int j = 0; j < FRAME_COLS_WALK; j++) { 
        walkFramesRight[index++] = tmp[i][j]; 
       } 
      } 
      walkAnimationRight = new Animation(0.044f, walkFramesRight); 
      stateTime = 0f; 


      walkSheetLeft = new Texture("ninjaWalkLeft.png"); 
      walkSheetWidth = walkSheetLeft.getWidth(); 
      walkSheetHeight = walkSheetLeft.getWidth(); 
      TextureRegion[][] tmp1 = TextureRegion.split(walkSheetLeft, (int) walkSheetRight.getWidth()/FRAME_COLS_WALK, (int)walkSheetLeft.getHeight()/FRAME_ROWS_WALK); 
      walkFramesLeft = new TextureRegion[FRAME_COLS_WALK * FRAME_ROWS_WALK]; 
      int index1 = 0; 
      for (int i = 0; i < FRAME_ROWS_WALK; i++) { 
       for (int j = 0; j < FRAME_COLS_WALK; j++) { 
        walkFramesLeft[index1++] = tmp1 [i][j]; 
       } 
      } 
      walkAnimationLeft = new Animation(0.044f, walkFramesLeft); 
      stateTime = 0f; 


     } 


     public Rectangle getBound(){ 
      return bound; 
     } 

     public void update(float delta){ 
      stateTime += delta; 
      currentFrameRight = walkAnimationRight.getKeyFrame(stateTime, true); 
      currentFrameLeft = walkAnimationLeft.getKeyFrame(stateTime, true); 
     } 


     public TextureRegion getCurrentFrameRight(){ 
      return currentFrameRight; 

     } 
     public TextureRegion getCurrentFrameLeft(){ 
      return currentFrameLeft; 
     } 
    } 

А вот ошибка:

> java.lang.NullPointerException 
>                     at 
> com.badlogic.gdx.graphics.g2d.TextureRegion.setRegion(TextureRegion.java:112) 
>                     at 
> com.badlogic.gdx.graphics.g2d.TextureRegion.<init>(TextureRegion.java:63) 
>                     at 
> com.jpfalmazan.thumbchaseninja.GameScreens.LevelOneScreen.show(LevelOneScreen.java:54) 
>                     at com.badlogic.gdx.Game.setScreen(Game.java:61) 
>                     at 
> com.jpfalmazan.thumbchaseninja.GameScreens.MenuScreen$1.clicked(MenuScreen.java:82) 
>                     at 
> com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:89) 
>                     at 
> com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:58) 
>                     at com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:353) 
>                     at 
> com.badlogic.gdx.backends.android.AndroidInput.processEvents(AndroidInput.java:379) 
>                     at 
> com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:457) 
>                     at 
> android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516) 
>                     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 
+0

один из ваших объектов будет причиной этого, добавьте журналы или попробуйте поймать использование операторов 'TextureRegion'. Ты получишь это. –

+0

Честно говоря, я не совсем уверен, как это сделать. – JAlmazan

+0

http://stackoverflow.com/documentation/java/89/exceptions-and-exception-handling/385/catching-an-exception-with-try-catch#t=20161123071434254621 –

ответ

0

вы можете найти точную линию в журнале logcat s, вы можете увидеть название деятельности, а также строку кода, и нажав на нее, вы будете перенаправлены на индивидуальную активность в той же строке.

Надеюсь, это вам поможет.

+0

Я попытался инициализировать currentFrameRight и currentFrameLeft в моем конструкторе WalkAnimate, и он, наконец, запускается, проблема в том, что он не анимируется, а показывает только один кадр. – JAlmazan

+0

Можете ли вы взглянуть на мой вопрос здесь: http://gamedev.stackexchange.com/questions/136318/how-to-refresh-dependencies-after-adding-freetype-extension-in-android-project – JAlmazan

+0

Ребята вы можете посетите мой новый вопрос здесь: https://stackoverflow.com/questions/42971321/how-to-restart-screen-in-libgdx-using-init-methods – JAlmazan

0

Похоже, вы не звоните walkAnimate.update(dt) прежде чем звонить walkAnimate.getCurrentFrameRight() в первый раз, поэтому walkAnimate.getCurrentFrameRight() возвращает null.

Кроме того, в ninjaWalk() вы создаете двух актеров (walkRightImage и walkLeftImage), добавляйте их только на сцену и никогда не обновляйте их текстуру. Вы должны переработать свою концепцию: создать одного участника при запуске, сохранить его в поле и изменить его текстуру в методе рендеринга/обновления.

+0

Я пробовал то, что вы сказали, и он работает, но не оживляет , показывается только один кадр. – JAlmazan

+0

В ninjaWalk() вы получаете только снимок текущей текстуры и устанавливаете ее для актера. Вы должны обновить текстуру актера в каждом кадре. – Sebastian

+0

Могу ли я попросить о помощи, как я могу это сделать? Я уже обновил walkAnimate, вызвав метод walkAnimate.update (deltaTime) в методе show прямо перед вызовом ninjaWalk(), и изображение не оживляет. Я с радостью отмечаю ваш ответ как правильный. – JAlmazan

0

Одна из ваших текстур либо неверна, либо вы пытаетесь получить к ней доступ до ее загрузки.

Вы можете указать это исключение;

com.badlogic.gdx.graphics.g2d.TextureRegion.setRegion(TextureRegion.java:112) 

Это означает, что область текстуры не может отображать идентификатор текстуры для действительной текстуры в вашей программе, так как ninjaWalkRight или ninjaWalkLeft не существует или не загружен.

Если вы используете упаковщик текстуры, тогда убедитесь, что ваши файлы называются ninjaWalkRight и ninjaWalkLeft.

Также используйте AssetManager, чтобы обеспечить загрузку этих файлов, прежде чем пытаться получить к ним доступ, так как это может быть проблемой.

+0

Можете ли вы взглянуть на мой вопрос здесь: http://gamedev.stackexchange.com/questions/136318/how-to-refresh-dependencies-after-adding-freetype-extension-in-android-project – JAlmazan