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!
Etwas ist null in Zeile 29 in Level1State bewegt - die Linie 29 ist? –
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