2014-04-23 5 views
-1

좋아, 그래서 3 스크린 MyGame 화면, GameScreen 화면 및 MainMenuScreen 있습니다. 나는 스크린을 터치 할 때 메인 렌더 스크린으로 간다. 내가 만지면 아무 일도 일어나지 않아 대신 스페이스 바를 사용하여 창문에서 연주했습니다. 이 MyGame이 있습니다 :NullPointerException LibGDX 안드로이드

package com.faturbansloth.mygdxgame; 

import com.badlogic.gdx.Game; 
import com.badlogic.gdx.Screen; 
import com.badlogic.gdx.graphics.g2d.BitmapFont; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 

public class MyGame extends Game { 


public BitmapFont font; 
public SpriteBatch batch; 
public void create(){ 
    batch = new SpriteBatch(); 
    font = new BitmapFont(); 
    this.setScreen(new MainMenuScreen(this)); 



} 
public void render(){ 
    super.render(); 
} 

public void dispose(){ 
    font.dispose(); 
    batch.dispose(); 
} 

} 

그리고 이것은 오류가 다음 MainMenuScreen

package com.faturbansloth.mygdxgame; 






import java.util.Iterator; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.Input.Keys; 
import com.badlogic.gdx.Input.Peripheral; 
import com.badlogic.gdx.Screen; 
import com.badlogic.gdx.graphics.GL10; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.math.MathUtils; 
import com.badlogic.gdx.math.Rectangle; 
import com.badlogic.gdx.math.Vector3; 
import com.badlogic.gdx.utils.Array; 
import com.badlogic.gdx.utils.TimeUtils; 

public class GameScreen implements Screen { 
final MyGame game; 


OrthographicCamera camera; 
Vector3 touch; 
boolean paused; 
Rectangle ship; 
boolean available; 
Array<Rectangle> asteroids; 
long lastDropTime; 



public GameScreen(final MyGame gam) { 
    this.game = gam; 


    camera = new OrthographicCamera(); 
    camera.setToOrtho(true,1080,1920); 


    touch = new Vector3(); 

    available = Gdx.input.isPeripheralAvailable(Peripheral.Accelerometer); 

    ship = new Rectangle(); 
    ship.x = 1080/2 - 128/2; 
    ship.y = 1600; 
    ship.width = 128; 
    ship.height = 128; 



    asteroids = new Array<Rectangle>(); 
    spawnAsteroi(); 
} 

private void spawnAsteroi(){ 
    Rectangle asteroi = new Rectangle(); 
    asteroi.x = MathUtils.random(0, 1080 - 100); 
    asteroi.y = 0; 
    asteroi.height = 100; 
    asteroi.width = 100; 
    asteroids.add(asteroi); 
    lastDropTime = TimeUtils.nanoTime(); 

} 

@Override 
public void render(float delta) { 

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

    camera.update(); 







    game.batch.setProjectionMatrix(camera.combined); 

    game.batch.begin(); 
    for(Rectangle asteroi: asteroids){ 
      game.batch.draw(Assets.texture_asteroi, asteroi.x, asteroi.y); 
      } 

       Assets.font.draw(game.batch, "Asteroids!", 366, 1100); 

       game.batch.draw(Assets.ship, ship.x, ship.y); 


       if(paused){ 
        game.batch.draw(Assets.pause, 0, 0); 
       } 




    game.batch.end(); 
    if(paused){ 
     if(Gdx.input.isTouched()){ 
      paused = false; 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e){ 
       e.printStackTrace(); 
      } 

     } 

    }else{ 
     generalUpdate(); 

    } 

    if(ship.x < 0) ship.x = 0; 
    if(ship.x > 1080 - 128) ship.x = 1080 - 128; 

    if(TimeUtils.nanoTime() - lastDropTime > 1000000000) spawnAsteroi(); 
    Iterator<Rectangle> iter = asteroids.iterator(); 
    while(iter.hasNext()){ 
     Rectangle asteroi = iter.next(); 
     asteroi.y +=200 * Gdx.graphics.getDeltaTime(); 
     if(asteroi.y + 100 < 0) iter.remove(); 
     if(asteroi.overlaps(ship)){ 
      iter.remove(); 
     } 

    } 
    } 



@Override 
public void dispose() { 
    game.batch.dispose(); 
    Assets.texture_asteroi.dispose(); 


} 




public void generalUpdate(){ 

    ship.x -= Gdx.input.getAccelerometerX(); 

    if(Gdx.input.isKeyPressed(Keys.SPACE) || (Gdx.input.isTouched())){ 
     paused = true; 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e){ 
      e.printStackTrace(); 
     } 

    } 

} 



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

} 

@Override 
public void show() { 


} 

@Override 
public void hide() { 

} 

@Override 
public void pause() { 

} 

@Override 
public void resume() { 

} 


} 

그리고 여기에 있습니다 : : 여기

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException:  java.lang.NullPointerException 
at  com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:113) 
Caused by: java.lang.NullPointerException 
at com.badlogic.gdx.graphics.g2d.SpriteBatch.draw(SpriteBatch.java:631) 
at com.faturbansloth.mygdxgame.GameScreen.render(GameScreen.java:90) 
at com.badlogic.gdx.Game.render(Game.java:46) 
at com.faturbansloth.mygdxgame.MyGame.render(MyGame.java:21) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:187) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:110) 

편집 죄송합니다 사람이 looonnnggg의 GameScreen입니다

package com.faturbansloth.mygdxgame; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.Input.Keys; 
import com.badlogic.gdx.Screen; 
import com.badlogic.gdx.graphics.Color; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.Texture.TextureFilter; 
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; 

public class MainMenuScreen implements Screen { 
final MyGame game; 

OrthographicCamera camera; 


public MainMenuScreen(final MyGame gam) { 
    game = gam; 

    camera = new OrthographicCamera(); 
    camera.setToOrtho(false, 1080, 1920); 

} 

public void render(float delta){ 
    Gdx.gl.glClearColor(0, 0, 0.2f, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    camera.update(); 

    game.batch.setProjectionMatrix(camera.combined); 

    game.batch.begin(); 
    FreeTypeFontGenerator gen = new FreeTypeFontGenerator(Gdx.files.internal("font1.otf")); 
    game.font = gen.generateFont(100); 
    game.font.getRegion().getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear); 
    game.font.setColor(Color.valueOf("7a7d7d")); 

    game.font.draw(game.batch, "Welcome to Asteroids!", 184, 800); 
    game.font.draw(game.batch, "Tap anywhere to begin.", 184, 500); 
    game.batch.end(); 

    if(Gdx.input.isTouched() || Gdx.input.isKeyPressed(Keys.SPACE)){ 
     game.setScreen(new GameScreen(game)); 
     dispose1(); 

    } 




} 

private void dispose1() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void resize(int width, int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void show() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void hide() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void pause() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void resume() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void dispose() { 
    // TODO Auto-generated method stub 

} 

} 

오류가 있습니다 : 게임의

Super.render() for MyGame 
game.batch.draw(Assets.texture_asteroi, asteroi.x, asteroi.y 
+0

# 113은 어느 라인입니까? – csmckelvey

+0

지난 'MainMenuScreen' – suitianshi

+1

사람들이 코드를 게시하도록 요청할 때 _relevant_ 코드 만 의미한다는 점에 유의하십시오. 예를 들어, GameScreen 클래스에는 몇 가지 비어있는 메소드가 있습니다. 우리는 그들을 볼 필요가 없습니다 (왜냐하면 그들은 절대적으로 아무것도하지 않기 때문입니다). – csmckelvey

답변

1

구조는 아주 이상한 보인다 ... 나는 오류입니다 코드에서 정확히 장소를 찾을 수는 없지만, 당신은 당신의 게임 구조를 변경해야하며 것 문제를 풀다.

몇몇 글로벌 팁 :

  1. Super.render()이 - 그냥 제거 당신이 당신의 MyGame class에 아무것도 렌더링 할 필요가 없습니다, 그것은 자원을 초기화하고 처음 게임 화면을 보여줍니다 단지의 주요 클래스입니다.
  2. Game 개체를 화면에 보내는 이유는 무엇입니까? 별표를 표시 할 때마다 SpriteBatch를 만들면 모든 화면에 동일한 SpriteBatch을 사용하면 안됩니다.
  3. BitmapFont font;을 게임에서 모든 그래픽 리소스를 관리하는 별도의 싱글 톤으로 이동하십시오.

난 당신이 모든 화면에 대해 별도의 SpriteBatch으로, 올바른 게임 구조를 만들 것인지 확신하고, 다른 장소에 MyGame이 샌딩하지 않고 문제를 해결할 것입니다.

관련 문제