Event Handling JButton Actionevent: starte Spiel

unchroot

Mitglied
hallo leute

ich bin grad dran mein erstes Spiel (naja eher Animation mit Bewegung und Jump🙂 ) zu programmieren...

hab das spiel soweit fertig, kann es von ner Testklasse aus starten. Aber ich wollte noch ein Menü einbauen als Intro...

wenn ich aber das Game von Actionperformed aus starten möchte geht das nicht, ich bekomme einen Grey-Fullscreen und folgenden Fehler:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Theorie.animation_2D.ScreenManager.getGraphics(ScreenManager.java:145)
	at Theorie.animation_2D.GameCore.loop(GameCore.java:63)
	at Theorie.animation_2D.GameCore.run(GameCore.java:42)
	at Theorie.animation_2D.Menu.startGame(Menu.java:72)
	at Theorie.animation_2D.Menu$2.actionPerformed(Menu.java:65)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(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.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(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$200(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$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.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$1.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)

die Zeilenangaben zeigen jeweils auf die draw-Methoden
und hier zum Verständnis noch bisschen Code:

Java:
public class TEST_ANIMATION {

	public static void main(String[] args) {
		@SuppressWarnings("unused")
		Menu menu = new Menu();
                // new Game().run(); // funktioniert!
	}
}

Java:
public class Menu extends JFrame {
....
	public Menu() {
        ... 
        // ActionListener wird als anonyme Klasse eingebunden
        play.addActionListener(new ActionListener() { // JButton
            // Beim Drücken des Buttons wird actionPerformed aufgerufen
            public void actionPerformed(ActionEvent e) {
              Menu.this.dispose(); 
              new Game().run(); //<========= funktioniert nicht
            }
        });
   
	}....

Alles ist im gleichen Pkg.
Es würd mich interessieren: Warum funktioniert es nicht? Und wie kann ich es anders hinbekommen sodass es funzt???:L

lg
 
der Code etwa von ScreenManager.getGraphics() hat nicht weiter zu interessieren?
irgendwo wird dort null verwendet,

getGraphics() selbst ist schon ein schlimmes Zeichen, wenn auch bisher nur dein Methodenname,
getGraphics() auf einem GUI-Objekt aufzurufen um ein Graphics-Objekt fürs Zeichnen zu erhalten wäre jedenfalls ein übler fehleranfälliger Weg,
man muss die normalen paint-Methoden korrekt überschreiben

hier ein Tutorial
http://www.java-forum.org/spiele-multimedia-programmierung/54795-quaxli-2d-spiele-tutorial.html
 
naja ich dachte es wird ein fehler sein, der mit sichtbarkeit anonymer klassen zu tun hat, denn ohne Intro funktioniert die ganze Animation reibungslos...

ScreenManger:
Java:
	public Graphics2D getGraphics() {
		Window window = device.getFullScreenWindow();
		if (window != null) {
			BufferStrategy strategy = window.getBufferStrategy();
			return (Graphics2D) strategy.getDrawGraphics();
		} else {
			return null;
		}
	}

GameCore: loop:
Java:
public void loop() {
		long startTime = System.currentTimeMillis();
		long currTime = startTime;

		while (isRunning) {
			long elapsedTime = System.currentTimeMillis() - currTime;
			currTime += elapsedTime;
			update(elapsedTime);

			// draw the screen
			Graphics2D g = screen.getGraphics();
			draw(g);
			g.dispose();
			screen.update();

			// take a nap
			try {
				Thread.sleep(20);
			} catch (InterruptedException ex) {
			}

wenn ich ehrlich bin: den screenmanager hab ich mehr oder weniger irgendwoher kopiert... Hab zuerst einen komplizierten gehabt, der den Fullscreen über DisplayMode-Parameter gesettet hat, hat aber nicht funktioniert, also hab ich jetzt einen ders über JFrame tut

ist aber nur ne Randbemerkung, aber wenn mich jemand belehren will, nur zu:
Java:
public void setFullScreen(JFrame myWindow){
		 // Remove the title bar, etc.
	     // If the window has already been set visible or packed, this triggers an error :(
         myWindow.setUndecorated(true);
	     // Do not allow user to resize the window...
	     // ...it should always be the size of the whole screen!
	     myWindow.setResizable(false);
	     // Next, make the window as large as the screen.
	     device.setFullScreenWindow( myWindow );
	       }

Das Tutorial muss ich mir anschauen, aber gibt halt so viele von denen, man weiss nicht wo anfangen 😉
 
der Unterschied dürfte hier konkret sein, dass aus der main gestartet Game nebenläufig ausgeführt wird,
aus dem Listener aber durch den AWT-Thread und solange der daran arbeitet kann ansonsten manches in der GUI nicht funktionieren

mindestens wäre wohl Standard, aus dem Listener einen Thread zu starten

------

allgemein kann ich von dem ScreenManger-Konzept nur abraten,
wenn es aber nicht ganz deine Idee ist dann kann man zumindest hoffen, dass es in gewissen Grenzen getestet ist und funktionieren soll
 
Danke, das war des Rätsels Lösung:

Java:
   play.addActionListener(new ActionListener() {
            // Beim Drücken des Buttons wird actionPerformed aufgerufen
            public void actionPerformed(ActionEvent e) {
				Menu.this.dispose();
				Thread thread = new Thread("Game thread") {
            	        public void run() {
            	            new Game().run();
            	        }
            	    };
            	    thread.start();
            }
        });
 

Neue Themen


Zurück
Oben