2014-04-30 18 views
10

Ich implementiere ein Spiel in Java, mit den unten gezeigten Klassen, um die Spiellogik zu steuern. Ich versuche sehr klar zu sein, wenn ich meine Frage erläutere.separate Logik und GUI in Java

  • Gamepanel

    • I diese Klasse verwenden, um die Spielschleife mit einem Gewinde zu starten (nur Spielschleife)

      public void run() { 
      init(); //initialize gamePanel components 
      // game loop 
      while (running) { 
           start = System.nanoTime(); 
           gameManager.update(); 
           KeyInput.update(); 
           MouseInput.update(); 
           gameManager.draw(graphic); 
           Graphics g2 = getGraphics(); 
           g2.drawImage(image, 0, 0, null); 
           g2.dispose(); 
      
           elapsed = System.nanoTime() - start; 
           wait = targetTime - elapsed/1000000; 
           if (wait < 0) 
          wait = 5; 
          try { 
           Thread.sleep(wait); 
          } catch (Exception e) { 
          e.printStackTrace(); 
          } 
      
      } 
      
  • GameManager

    • Ich habe diese Klasse jeden Aspekt des Spiels zu steuern, wie (update, Grafiken)

      private void loadState(int state) { 
      
      if (state == States.MENU.getValue()) 
      gameState = new Menu(this); 
      else if (state == States.GAME.getValue()) 
      gameState = new Game(this); 
      else if (state == States.PATHSELECT.getValue()) 
      gameState = new SelectPath(this); 
      } 
      public void update() { 
      if (gameState != null) 
      gameState.update(); 
      } 
      
      public void draw(java.awt.Graphics2D graphic) { 
      if (gameState != null) 
      gameState.draw(graphic); 
      else { 
      JOptionPane.showMessageDialog(null, JOptionPane.ERROR_MESSAGE); 
          } 
      } 
      
  • Gamestate

    • GameState ist eine abstrakte Klasse, die als Konstruktorparameter ein inst ance von GameManager und es hat abstrakte Methoden in jedem GameState implementiert (Menü, Spiel, MultiPlayer, etc ..)

    • diese Klasse diese abstrakten Methoden hat:

      • Regler() - >, dass die Zustandslogik

      • update() überprüfen -> bei der current ist ein multyplayer, rufen Sie diese Methode der Update-Methode der Klasse Player, etc ...

      • draw (Graphics g) -> ziehen die Objekte des current

I zur Herstellung einer Utility-Klasse Singleton gedacht zu screenen, die alle Unentschieden implementiert() von jedem Staat, aber es ist sehr unangenehm, alle in einer einzigen Klasse einzufügen.

Beispiel:

statt gameState.draw(graphic); des Aufrufs Ich nenne Render.getRenderInstance().draw(graphic,gameState); diese Lösungen funktioniert, aber ich mag es nicht.

Also wie kann ich die Draw-Methode vom Rest der Logik auf eine schöne Weise teilen?

Einige Ratschläge?Vielen Dank.

+2

Ich schlage vor, dass Sie diese Frage unter http://gamedev.stackexchange.com/ stellen, da Fragen bezüglich der Rendering-Pipeline zu spezifisch sind. – setec

Antwort

3

Die übliche Vorgehensweise ist das Spiel in zwei Teile zu teilen:

  • die Logik, die

  • die Szene in Ihrem Fall getan OK werden sieht, wo die Dinge gezogen werden

Hier in Pseudo-Code ist, wie ich es tun:

the main loop: 
    gamestate.update() 
    scene.render(); 

In der Szene sollten Sie alle Ihre Grafikoperationen haben. Sie sollten neue Grafiken zu der Szene hinzufügen, indem Sie eine Anruf ähnlich wie mit:

scene.addObject(SomeGraphic graphic); 

So ist die Szene, die Grafik jede Haupt Schleifeniterationslatenzzeit machen würde.

Um dies zu ermöglichen, sollten Sie eine Liste oder eine andere Sammlung in der Scene-Klasse behalten und jedes Objekt für jeden Tick rendern. So ist der actuall scene.render() würde wie so aussehen:

public void render() { 
    for(SomeGraphic graphic : objects) { 
    graphic.draw() 
    } 
} 

Sie können dann kontrollieren, was in der Szene aus dem Spiel Logik - Sie werden in der Lage hinzufügen und löschen Objekte usw.