2017-02-23 2 views
-3

Ich brauche Hilfe, um zu verstehen, wie man ein Spiel neu startet. Ich folge einem Tutorial im Buch Killer Game Programming in Java, und ich möchte ein Spiel neu starten, ohne das Spiel zu beenden und das Spiel erneut zu starten. Ich habe Schwierigkeiten zu verstehen, welchen Teil des Codes ich neu initialisieren muss, um ein neues Spiel zu starten. Ich versuche einen Weg zu finden, der es mir erlaubt, meine Gamestats zu behalten, aber das Spiel zurückzusetzen. Jetzt weiß ich nur, wie ich das Spiel zurücksetzen kann, da ich noch keine Statistiken habe.Welche Rolle in meinem Code spielt das Neustarten des Spiels?

Ich habe dies ein Keylistener, wo ich "N" drücken möchte, um das Spiel neu zu starten.

if(e.getKeyCode() == KeyEvent.VK_N){ 
       newGame(); 

Meine Frage ist, Was soll die newGame() das Spiel neu zu starten, tun?

Dieser Code wird nicht ausgeführt, da ich versucht habe, alles zu entfernen, von dem ich glaube, dass es für meine Frage nicht relevant ist.

Hoffe, dass ich nicht zu viel haben entfernen: S

Hauptklasse

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 


public class WormChase extends JFrame implements WindowListener 
{ 
    private WormPanel wp;  // where the worm is drawn 


    public WormChase(long period) 
    { super("The Worm Chase"); 
    makeGUI(period); 

    pack(); 
    setResizable(false); 
    setVisible(true); 
    } // end of WormChase() constructor 



    // ---------------------------------------------------- 

    public static void main(String args[]) 
    { 
    int fps = DEFAULT_FPS; 
    if (args.length != 0) 
     fps = Integer.parseInt(args[0]); 

    long period = (long) 1000.0/fps; 
    System.out.println("fps: " + fps + "; period: " + period + " ms"); 

    new WormChase(period*1000000L); // ms --> nanosecs 
    } 


} // end of WormChase class 

Die zweite Klasse

public class WormPanel extends JPanel implements Runnable 
{ 
    private static final int PWIDTH = 500; // size of panel 
    private static final int PHEIGHT = 400; 


    private Thread animator;   // the thread that performs the animation 

    private WormChase wcTop; 
    private Worm fred;  // the worm 
    private Obstacles obs; // the obstacles 

    public WormPanel(WormChase wc, long period) 
    { 
    wcTop = wc; 
    this.period = period; 

    // create game components 

    addKeyListener(new KeyListener() { 

      if(e.getKeyCode() == KeyEvent.VK_N){ 
       newGame(); 
      } 
    }); 
    } 


    public void addNotify() 
    // wait for the JPanel to be added to the JFrame before starting 
    { super.addNotify(); // creates the peer 
    startGame();   // start the thread 
    } 


    private void startGame() 
    // initialise and start the thread 
    { 
    if (animator == null || !running) { 
     animator = new Thread(this); 
     animator.start(); 
    } 
    } // end of startGame() 


    private void newGame() 
    // initialise and start the thread 
    { 

    public void run() 
    /* The frames of the animation are drawn inside the while loop. */ 
    { 

    running = true; 

    while(running) { 
     gameUpdate(); 
     gameRender(); 
     paintScreen(); 

    } 

    } 



} // end of WormPanel class 
+2

Ihr Code ist viel zu unvollständig, um einen besseren Ratschlag geben zu können als Code nach [MVC] (https://en.wikipedia.org/wiki)/Modell% E2% 80% 93view% E2% 80% 93controller) und es sollte ziemlich einfach sein, ein neues Spiel zu starten. – Paul

+0

Oh nein, ich hatte gehofft, ich hätte es genug vereinfacht! Nun gut – tore

+0

@paul auch, danke für die Einstellung mich in Richtung MVC :) – tore

Antwort

1

Sie sollten Ihre Schlüssel Hörer auf die Basisklasse (WormChase) bewegen das Spiel startet, dann sollten Sie eine Methode erstellen, die alles initialisiert, genau wie der WormChase-Konstruktor, weil das das Spiel startet. Also, was Sie genau machen müssen, ist, greifen Sie alles, was im Konstruktor ist, verschieben Sie es in eine Methode wie "startGame" und im Konstruktor nennen Sie es. Ich denke jetzt, dass Sie den Schlüssel-Listener in der Fensterklasse behalten können, aber Sie müssen die Basisklasse bemerken, dass Sie das Spiel beendet haben, indem Sie es neu starten. Das bedeutet, dass der Schlüssel-Listener, wenn Sie die N-Taste drücken, das Fenster beenden muss, in dem das Spiel ausgeführt wird, und den Haupt-Thread erkennen, mit dem Sie ein neues Spiel starten. Das bedeutet, dass Sie den Konstruktor erneut aufrufen.

Wenn Sie das Spiel neu starten möchten, ohne das Fenster zu beenden, das in der Hauptmethode startet, müssen Sie über alles nachdenken, was beim Start des Spiels eingestellt wird und welche Werte vorhanden sind. Dann erstellen Sie einfach eine Methode, die alles auf "Startwerte" setzt und dann das Spiel startet.

Das bedeutet im Grunde neu jedes Objekt, das Sie haben und nutzen in der WormPanel Klasse, wie fred = new WormChase etc ...

Ich bin wirklich kein Fan von verschachtelten Funktionen so würde ich auf jeden Fall versuchen, es zu vermeiden selbst Java unterstützt es nicht (newGame() -> run())

+0

Hey vielen Dank dafür. Ich werde experimentieren müssen und lesen Sie Ihren Kommentar ein paar Mal, um alles zu verstehen. Danke, dass du dir Zeit genommen hast, dies zu beantworten :) – tore

Verwandte Themen