2014-03-31 3 views
0

libGDX에서 scene2D를 배우고 nullPointerException을 계속 실행하는 데 도움이되는 작은 프로젝트를 시작했습니다. 내 목표는 플레이어가 동작 시퀀스를 사용하여 점프하도록하는 것입니다. 내 문제는 플레이어가 뛰어 내린다는 것이지만, 일단 게임이 다시 쓰러지면 떨어집니다. 제가 생각하기에 문제를 일으키는 코드의 비트를 포함 시켰습니다. libGDX와 scene2d에 대해 아직 상당히 익숙하지 않기 때문에 setX() setY()와 setPosition (x, y) 메소드 사이의 차이점에 익숙하지 않습니다.libGDX MoveToAction nullPointerException

나는 또한 정확하게 델타와 parentAlpha이 어떻게 제대로

내가

Exception in thread "LWJGL Application" java.lang.NullPointerException 
at com.badlogic.gdx.scenes.scene2d.actions.MoveToAction.begin(MoveToAction.java:26) 
at com.badlogic.gdx.scenes.scene2d.actions.TemporalAction.act(TemporalAction.java:48) 
at com.badlogic.gdx.scenes.scene2d.actions.SequenceAction.act(SequenceAction.java:65) 
at com.badlogic.gdx.scenes.scene2d.Actor.act(Actor.java:85) 
at com.chiefpeanut.noodle.Tony.act(Tony.java:48) 
at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48) 
at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:225) 
at com.chiefpeanut.noodle.GameScreen.render(GameScreen.java:54) 
at com.badlogic.gdx.Game.render(Game.java:46) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:207) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114) 

내 플레이어 클래스의 중요한 부분 얻는 오류를 사용하는 것에 대해 좀 더 알고 싶습니다

public class Tony extends Actor{ 

public Rectangle bounds; 
public float posX; 
public float posY; 
MoveToAction jumpUp; 
MoveToAction jumpDown; 
public Tony() {  
    posX = 10f; 
    posY = 10f; 

    bounds = new Rectangle(); 
    setHeight(100); 
    setWidth(100); 
    //scale(1, 1); 
    setPosition(10, 10); 


    setX(10f); 
    setY(10f); 
    setPosition(10, 10); 
    jumpUp = new MoveToAction(); 
    jumpUp.setPosition(10, 80); 
    jumpUp.setDuration(2f); 

    jumpDown = new MoveToAction(); 
    jumpDown.setPosition(10, 10); 
    jumpDown.setDuration(2f); 

} 


public void act(float delta){ 
    super.act(delta);<<--------SHOWS ERROR OCCURRING HERE------ 
    updateBounds(); 
    } 
public void jump() { 
    addAction(Actions.sequence(jumpUp, jumpDown)); 

} 

public void draw(SpriteBatch batch, float parentAlpha){ 
    batch.draw(Assets.textureTony, getX(), getY(), getWidth(), getHeight()); 

} 


} 

내 GameScreen 클래스의 중요한 부분에 관해서는, 내가 가진

public class GameScreen implements Screen, GestureListener { 

MyGame game; 
OrthographicCamera camera; 
static SpriteBatch batch; 
Stage stage; 
Tony player; 
Array<Block> blocks; 

public GameScreen(MyGame game) { 
    this.game = game; 
    camera = new OrthographicCamera(); 
    camera.setToOrtho(false, 1920, 1080); 
    camera.update(); 

    player = new Tony(); 

    batch = new SpriteBatch(); 
    stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

    stage.addActor(player);  

} 

@Override 
public void render(float delta) { 
    Gdx.gl.glClearColor(1F, 1F, 1F, 1F); 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    batch.setProjectionMatrix(camera.combined); 

    stage.act(delta);//<<----SHOWS ANOTHER ERROR OCCURRING HERE------- 
    stage.draw(); 
    System.out.println("rendered"); 


    if(Gdx.input.isKeyPressed(Keys.W)){ 
     player.jump(); 
    } 
    if(Gdx.input.isKeyPressed(Keys.D)){ 
     //player.testMove(); 
     System.out.println(player.getX()); 
    } 


} 

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

} 

@Override 
public void show() { 
    Gdx.input.setInputProcessor(new GestureDetector(this)); 

} 

@Override 
public void hide() { 
    Gdx.input.setInputProcessor(null); 

} 

} 

나는 나의 렌더링을 잘못 사용하고 있다고 가정하기 시작했다. - 나는 5 개의 다른 튜토리얼에서 벗어나기 때문에 아마 맞을 것이다. 그러나 스택 트레이스에서 MoveToAction.java:26 오류를 클릭하면 나에게 line 26 on This document (on github) "startX = actor.getX();"라는 줄에 오류가 있습니다. 나는 매우 혼란스러워하고 며칠 동안 다른 일을 시도하고 내가 뭘 잘못하고 있는지 알아 내야 만합니다.

도움 주셔서 대단히 감사합니다.

+0

편집 : 그것은 문자를 보여합니까 점프를 수행하지만 그는 다시 게임 충돌 내려 오는 한 번. –

답변

0

나는 정확한 오류를 모른다. 이를 위해서는 디버그와 중단 점을 사용해야합니다. 오류 자체는 MoveToAction.begin() 메서드 내에서 26 행에 발생합니다.이 시점에서 어떤 변수가 null인지 알아 보려면이 행을 봐야합니다. 최대한 빨리 코드를 디버깅하는 것이 좋습니다.
코드를 보면 Actor이 null 인 것처럼 보입니다. 너 어딨어?
어쨌든 Actions 클래스를 사용하는 것이 좋습니다. 그것은 당신에게 풀링 된 행동을 돌려 주며 사용하기 쉽습니다. 당신의 jump() 방법이처럼 사용할 수 있습니다 다음 jump() 메소드가 호출되는

public void jump() { 
    this.addAction(Actions.sequenze(Actions.moveTo(10, 80, 2f), Actions.moveTo(10, 10, 2f))); 
} 

경우, 예를 들어 키를 누르는 경우, 당신은 당신이 allready 점프 또는하지 않는 경우라는 부울을 개최한다. 두 번째 질문에 대한

:

  1. float delta 초에 render() 방법의 마지막 통화 이후 경과 된 시간입니다. FPS (초당 프레임 수)는 alpha : FPS = 1/delta을 사용하여 계산됩니다. Actoract(delta) 메서드는이 시간을 사용하여 위치, 회전을 업데이트하는 데이 delta을 사용합니다. 예를 들어 Actor은 초당 10 단위를 이동해야합니다. act(delta)setX(getX()+10*delta)입니다.
  2. float parentAlphaActor가에있는 groupalpha 값 (투명도)에 대해 설명합니다. 모든 stageActorstage.addActor(myActor)에 추가되는 루트 그룹을 가지고 있습니다. 물론 stageGroup을 추가 할 수도 있습니다. group을 반 투명하게하려면 alpha을 0.5f로 설정하십시오. 그러면 group에있는 Actor은 모두이 방법으로 parentAlpha으로 표시됩니다. (getColor에서를

    공공 무효 무승부 (의 SpriteBatch 배치, parentAlpha 플로트) { 컬러 색상 = 당신은 당신의 ActorClass를이 알파를 무시하지만, 당신은 또한 그를이 알파에 의해 영향을받을하도록 할 수 있습니다 (귀하의 케이스 Tony 클래스)하도록 할 수 있습니다); // 액터 틴트 색상 batch.setColor (color.r, color.g, color.b, color.a * parentAlpha); // 읽을}

뭔가를 을 그릴 : Scene2D wiki article

+0

이것은 약 4 일 동안 나를 괴롭 히고 당신은 그것을 고쳤다. 작동하게하려면 "this"를 추가해야했습니다. 고마워. –

+0

내가 도울 수있어서 기뻐. (: – Springrbua

0

풀에서 Scene2d 작업을 사용해보십시오. "Actions"클래스에는 풀에서 액션을 만들거나 다시 사용하는 정적 메서드가 있습니다. 이것은보다 읽기 쉽고 메모리 효율이 높습니다.

addAction( Actions.sequence( Actions.moveTo(x1, y1, t1), Actions.moveBy(x2, y2, t2)));