2016-04-21 3 views
0

Ich habe versucht, ein grundlegendes Spiel mit einem Menü mit 10 Niveaus zu machen. Der Pegel ausgewählt soll geladen werden, wenn die Enter-Taste gedrückt wird, aber ich erhalte eine große Fehlermeldung:Nicht funktionierendes Menü Errichtet in Java

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at GameState.Level1State.init(Level1State.java:29) 
at GameState.Level1State.<init>(Level1State.java:78) 
at GameState.GameStateManager.loadState(GameStateManager.java:35) 
at GameState.GameStateManager.setState(GameStateManager.java:77) 
at GameState.LevelSelect.select(LevelSelect.java:82) 
at GameState.LevelSelect.keyPressed(LevelSelect.java:121) 
at GameState.GameStateManager.keyPressed(GameStateManager.java:95) 
at Main.GamePanel.keyPressed(GamePanel.java:115) 
at java.awt.Component.processKeyEvent(Unknown Source) 
at javax.swing.JComponent.processKeyEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at  java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at  java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at GameState.GameStateManager.keyReleased(GameStateManager.java:99) 
at Main.GamePanel.keyReleased(GamePanel.java:119) 
at java.awt.Component.processKeyEvent(Unknown Source) 
at javax.swing.JComponent.processKeyEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at  java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

Dies ist der Code für in denen die Werte erhalten ausgewählt und geladen:

package GameState; 



public class GameStateManager { 
private GameState[] gameStates; 
private int currentState; 

public static final int NUMGAMESSTATES = 12; 
public static final int MENUSTATE = 0; 
public static final int LEVEL1STATE = 1; 
public static final int LEVEL2STATE = 2; 
public static final int LEVEL3STATE = 3; 
public static final int LEVEL4STATE = 4; 
public static final int LEVEL5STATE = 5; 
public static final int LEVEL6STATE = 6; 
public static final int LEVEL7STATE = 7; 
public static final int LEVEL8STATE = 8; 
public static final int LEVEL9STATE = 9; 
public static final int LEVEL10STATE = 10; 
public static final int LEVELSELECT = 11; 

public GameStateManager(){ 
    gameStates = new GameState[NUMGAMESSTATES]; 

    currentState = MENUSTATE; 
    loadState(currentState); 
} 

public void loadState(int state){ 
    if (state == MENUSTATE){ 
     gameStates[state] = new MenuState(this); 
    } 
    if(state == LEVEL1STATE){ 
     gameStates[state] = new Level1State(this); 
    } 
    if(state == LEVEL2STATE){ 
     gameStates[state] = new Level2State(this); 
    } 
    if(state == LEVEL3STATE){ 
     gameStates[state] = new Level3State(this); 
    } 
    if(state == LEVEL4STATE){ 
     gameStates[state] = new Level4State(this); 
    } 
    if(state == LEVEL5STATE){ 
     gameStates[state] = new Level5State(this); 
    } 
    if(state == LEVEL6STATE){ 
     gameStates[state] = new Level6State(this); 
    } 
    if(state == LEVEL7STATE){ 
     gameStates[state] = new Level7State(this); 
    } 
    if(state == LEVEL8STATE){ 
     gameStates[state] = new Level8State(this); 
    } 
    if(state == LEVEL9STATE){ 
     gameStates[state] = new Level9State(this); 
    } 
    if(state == LEVEL10STATE){ 
     gameStates[state] = new Level10State(this); 
    } 
    if(state == LEVELSELECT){ 
     gameStates[state] = new LevelSelect(this); 
    } 

} 

private void unloadState (int state){ 
    gameStates[state] = null; 
} 

public void setState(int state){ 
    unloadState(currentState); 
    currentState = state; 
    loadState(currentState); 
} 

public void update(){ 
    try{ 
     gameStates[currentState].update(); 
    } 
    catch(Exception e){} 
} 

public void draw(java.awt.Graphics2D g){ 
    try{ 
     gameStates[currentState].draw(g); 
    } 
    catch(Exception e){} 
} 

public void keyPressed(int k){ 
    gameStates[currentState].keyPressed(k); 
} 

public void keyReleased(int k){ 
    gameStates[currentState].keyReleased(k); 
} 
} 

Hier ist das Menü, in dem die Ebenen vom Benutzer ausgewählt werden. Es geht dann zu dem Code, den ich oben gepostet habe:

Hier ist ein Beispiel für 1 der Ebenen. Es ist ein einfaches Spiel mit fahrenden Autos von links nach rechts und man muss nach oben, aber das ist nicht wirklich relevant, denke ich für das Menü. Das Spiel hat funktioniert, bevor ich versucht habe, das Menü zu implementieren.

package GameState; 

import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.event.KeyEvent; 
import java.util.ArrayList; 

import Character.Player; 
import Enemy.Enemy; 
import Enemy.Enemy2; 
import Main.Background; 

public class Level1State extends GameState { 
//variables 
private Background bg; 
private Enemy enemy; 
private Enemy2 enemy2; 
public static Player player; 
public boolean Explosion = false; 

//arraylists 
private ArrayList<Enemy> enemies; 
private ArrayList<Enemy2> enemies2; 

public void init() { 
    //new enemies 
    populateEnemies(); 
    populateEnemies2(); 
    enemy.setMoveSpeed(-2); 
    enemy2.setMoveSpeed(2); 
    //new images and objects 
    bg = new Background("/Images/achtergrond2.png"); 
    enemy = new Enemy("/Images/Square.png"); 
    enemy2 = new Enemy2("/Images/Square.png"); 
    player = new Player("/Images/character.png"); 
} 

private void populateEnemies() { 
    //new enemies 

    enemies = new ArrayList<Enemy>(); 

    Enemy s; 
    Point[] points = new Point[] { 
      new Point(-50, 136), 
      new Point(-100, 76) 
    }; 
    for (int i = 0; i < points.length; i++) { 
     s = new Enemy("/Images/Square.png"); 
     s.setPosition(points[i].x, points[i].y); 
     enemies.add(s); 
    } 

} 

private void populateEnemies2() { 
    //new enemies 

    enemies2 = new ArrayList<Enemy2>(); 

    Enemy2 s; 
    Point[] points = new Point[] { 
      new Point(450, 106), 
      new Point(400, 46) 
    }; 
    for (int i = 0; i < points.length; i++) { 
     s = new Enemy2("/Images/Square.png"); 
     s.setPosition(points[i].x, points[i].y); 
     enemies2.add(s); 
    } 

} 


public Level1State(GameStateManager gsm) { 
    //graphics 
    this.gsm = gsm; 
    init(); 
} 

public void update() { 
    //enemy.update(); 
    for (int i = 0; i < enemies.size(); i++) { 
     Enemy e = enemies.get(i); 
     e.update(); 
    } 

    for(int i = 0; i<enemies2.size(); i++){ 
     Enemy2 e = enemies2.get(i); 
     e.update(); 
    } 
    // player.update(); 
    player.update(); 

} 

public void draw(Graphics2D g) { 
    // draw background 
    bg.draw(g); 

    // draw player 
    player.draw(g); 

    // draw enemies 
    for (int i = 0; i < enemies.size(); i++) { 
     enemies.get(i).draw(g); 
    } 

    for (int i = 0; i < enemies2.size(); i++) { 
     enemies2.get(i).draw(g); 
    } 
} 

public void keyPressed(int k) { 
    //all key settings 
    if (k == KeyEvent.VK_D) {  
     player.setSpeedX(1); 
    } 
    if (k == KeyEvent.VK_A) { 
     player.setSpeedX(-1); 
    } 
    if(k == KeyEvent.VK_W){ 
     player.setSpeedY(-1); 
    } 
    if(k == KeyEvent.VK_S){ 
     player.setSpeedY(1); 
    } 

} 

public void keyReleased(int k) { 
    if (k == KeyEvent.VK_A) { 
     player.setSpeedX(0); 
    } 
    if (k == KeyEvent.VK_D) { 
     player.setSpeedX(0); 
    } 
    if(k == KeyEvent.VK_S){ 
     player.setSpeedY(0); 
    } 
    if(k == KeyEvent.VK_W){ 
     player.setSpeedY(0); 
    } 

} 

public static Player getPlayer() { 
    return player; 
} 

} 

Sorry für den langen Post, aber wollte den ganzen Code da draußen bekommen. Ich weiß nicht genau, wo der Fehler liegt. Ich habe in Eclipse editiert und es gibt keine Fehler, daher bin ich im Moment ahnungslos. Würde mich freuen, wenn jemand eine Idee hätte, was schief läuft. Danke im Voraus!

+0

Etwas ist null in Zeile 29 in Level1State bewegt - die Linie 29 ist? –

+0

Für zukünftige Referenz: Haben Sie keine Angst vor dem Stack-Trace. Gehe dorthin, wo es dich zeigt, finde heraus, was die Ausnahme auslöst und aus welchem ​​Grund, und repariere dann das – RecursiveExceptionException

Antwort

0

Du

enemy.setMoveSpeed(-2); 
enemy2.setMoveSpeed(2); 

in Ihrem Level1Stateinit() Methode aufrufen. Problem ist enemy und enemy2 sind beide Null in dieser Phase, die eine NullPointerException ausgelöst werden verursacht.


Versuchen Sie, die oben genannten Zeilen unter

enemy = new Enemy("/Images/Square.png"); 
enemy2 = new Enemy2("/Images/Square.png"); 
+0

Arbeitete für mich danke. Diese Zeilen geändert und es funktioniert jetzt gut, danke. –