public class PlayState extends State {
private static final int TUBE_SPACING = 125;
private static final int TUBE_COUNT = 4;
private static final int GROUND_Y_OFFSET = -30;
private static final int COIN_SPACING = 100;
private static final int COIN_COUNT = 2;
public int SCORE = 0;
private Bird bird;
private Coin coin;
private Texture bg;
private Texture ground;
private Vector2 groundPos1, groundPos2;
private Array<Tube> tubes;
private Array<Coin> coins;
public PlayState(GameStateManager gsm) {
super(gsm);
bird = new Bird(50, 300);
cam.setToOrtho(false, FlappyDemo.WIDTH / 2, FlappyDemo.HEIGHT / 2);
bg = new Texture("bg.png");
ground = new Texture("ground.png");
groundPos1 = new Vector2(cam.position.x - cam.viewportWidth / 2, GROUND_Y_OFFSET);
groundPos2 = new Vector2((cam.position.x - cam.viewportWidth / 2) + ground.getWidth(), GROUND_Y_OFFSET);
tubes = new Array<Tube>();
for(int i = 1; i <= TUBE_COUNT; i++){
tubes.add(new Tube(i * (TUBE_SPACING + Tube.TUBE_WIDTH)));
}
coins = new Array<Coin>();
for(int i = 1; i<= COIN_COUNT; i++){
coins.add(new Coin(i * (COIN_SPACING + (Coin.COIN_WIDTH / 3))));
}
}
@Override
protected void handleInput() {
if(Gdx.input.justTouched()){
bird.jump();
}
}
@Override
public void update(float dt) {
handleInput();
updateGround();
bird.update(dt);
coin.update(dt);
cam.position.x = bird.getPosition().x +80;
updateCoin();
updateTube();
if(bird.getPosition().y <= ground.getHeight() + GROUND_Y_OFFSET){
gsm.set(new MenuState(gsm));
System.out.println("Score : "+SCORE);
}
cam.update();
}
@Override
public void render(SpriteBatch sb) {
sb.setProjectionMatrix(cam.combined);
sb.begin();
sb.draw(bg, cam.position.x - (cam.viewportWidth / 2), 0);
sb.draw(bird.getTexture(), bird.getPosition().x, bird.getPosition().y);
for(Tube tube : tubes) {
sb.draw(tube.getTopTube(), tube.getPosTopTube().x, tube.getPosTopTube().y);
sb.draw(tube.getBottomTube(), tube.getPosBotTube().x, tube.getPosBotTube().y);
}
for(Coin coin : coins){
sb.draw(coin.getTexture(), coin.getPosCoin().x, coin.getPosCoin().y);
}
sb.draw(ground, groundPos1.x, groundPos1.y);
sb.draw(ground, groundPos2.x, groundPos2.y);
sb.end();
}
@Override
public void dispose() {
bg.dispose();
bird.dispose();
ground.dispose();
for(Tube tube : tubes)
tube.dispose();
for(Coin coin : coins)
coin.dispose();
System.out.println("PlayState disposed");
}
private void updateGround(){
if(cam.position.x - (cam.viewportWidth / 2) > groundPos1.x + ground.getWidth())
groundPos1.add(ground.getWidth() * 2, 0);
if(cam.position.x - (cam.viewportWidth / 2) > groundPos2.x + ground.getWidth())
groundPos2.add(ground.getWidth() * 2, 0);
}
private void updateTube(){
for(int i = 0; i< tubes.size; i++){
Tube tube = tubes.get(i);
if(cam.position.x - (cam.viewportWidth / 2) > tube.getPosTopTube().x + tube.getTopTube().getWidth()){
tube.reposition(tube.getPosTopTube().x + ((Tube.TUBE_WIDTH + TUBE_SPACING) * TUBE_COUNT));
}
if(tube.collides(bird.getBounds())){
gsm.set(new MenuState(gsm));
System.out.println("Score : "+SCORE);
}
}
}
private void updateCoin(){
for(int i = 0; i< coins.size; i++){
Coin coin = coins.get(i);
if(cam.position.x - (cam.viewportWidth / 2) > coin.getPosCoin().x + coin.getTexCoin().getWidth()){
coin.reposition(coin.getPosCoin().x + ((Coin.COIN_WIDTH + COIN_SPACING) * COIN_COUNT));
}
if(coin.collides(bird.getBounds())){
SCORE = SCORE + 10;
System.out.println("Collided");
}
}
}
}
public class Coin {
public static final int COIN_WIDTH = 32;
public static final int COIN_HEIGHT = 32;
public static final int COIN_SCORE = 10;
private static final int FLUCTUATION = 150;
private static final int COIN_GAP = 100;
private Texture texCoin;
private Vector2 posCoin;
private Rectangle boundsCoin;
private Random randCoin;
private Animation coinAnimation;
public Coin(int x){
texCoin = new Texture("Coin.png");
randCoin = new Random();
posCoin = new Vector2(x, randCoin.nextInt(Tube.TUBE_GAP) + COIN_GAP);
coinAnimation = new Animation(new TextureRegion(texCoin), 3, 0.5f);
boundsCoin = new Rectangle(x, posCoin.y, texCoin.getWidth() / 3, texCoin.getHeight());
}
public void update(float dt){
try{
coinAnimation.update(dt);
posCoin.set(randCoin.nextInt(FLUCTUATION) + COIN_GAP, randCoin.nextInt(FLUCTUATION)+ Tube.TUBE_GAP);
boundsCoin.setPosition(posCoin.x, posCoin.y);
}catch(Exception e){
System.out.println("Errrrrr!");
}
}
public Texture getTexCoin() { return texCoin;}
public Vector2 getPosCoin() { return posCoin;}
public TextureRegion getTexture() {
return coinAnimation.getFrame();
}
public void reposition(float x){
posCoin.set(x, randCoin.nextInt(FLUCTUATION) + COIN_GAP);
boundsCoin.setPosition(posCoin.x, posCoin.y);
}
public boolean collides(Rectangle coinBound){
return coinBound.overlaps(boundsCoin);
}
public void dispose(){
texCoin.dispose();
}
}
线程中的异常&#34; LWJGL应用程序&#34;显示java.lang.NullPointerException 在com.games.flappy.statess.PlayState.update(PlayState.java:75) 在com.games.flappy.statess.GameStateManager.update(GameStateManager.java:31) 在com.games.flappy.FlappyDemo.render(FlappyDemo.java:37) 在com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:223) 在com.badlogic.gdx.backends.lwjgl.LwjglApplication $ 1.run(LwjglApplication.java:124)
答案 0 :(得分:0)
是否爆炸了:
coin.update(dt);
你有一个硬币变量,但看起来你实际上没有给它任何东西。其余的代码作用于硬币数组,当然,硬币数组包含许多单独的硬币对象。但我不认为硬币变量引用任何东西吗? (很难说出第75行实际指向的是什么)