2016-06-22 11 views
1

Ich schreibe ein einfaches Shoot'em up Spiel in Java mit LibGDX als Hauptbibliothek. Ich möchte, dass jeder Gegner im Spiel jede Art von Bewegung ausführen kann, unabhängig von ihrem Typ. Das Problem tritt auf, wenn versucht wird, die Logik der Bewegungen einer KI von jeder Feindklasse zu isolieren.Mehrere feindliche Bewegungen in der Spielentwicklung

Ein anschauliches Beispiel:

  1. Mov A: Linear, von oben nach unten.
  2. Mov B: Chase Spieler Charakter
  3. Mov C: Zeigen Sie, schießen und fliehen.

Enemies:

  1. Spinne. Führen Sie Mov A
  2. Eine andere Spinne. Mach Mov B
  3. Zusammengefasst: In der Lage sein, Züge unabhängig vom Feind zuzuweisen.

Was wäre der beste Ansatz?

Antwort

0

Verwenden Sie eine Entitätssystembibliothek wie https://github.com/libgdx/ashley oder https://github.com/junkdog/artemis-odb.

würden Sie dann erstellen Systeme:

  1. LinearTopBottomMovementSystem
  2. ChasePlayerMovementSystem
  3. ShowUpSystem
  4. ShootSystem (Sie wollen wahrscheinlich auch ein BulletMovementSystem)
  5. FleeSystem

Dann erstellen Komponenten:

  1. LinearTopBottomMovementComponent
  2. ChasePlayerMovementComponent
  3. ShowUpComponent
  4. ShootComponent
  5. FleeComponent

Wenn Feinde (Entitäten) Erstellen Sie erstellen:

  1. Spinne Entität mit LinearTopBottomMovementComponent
  2. Einer weiteren Spinne Entität mit ChasePlayerMovementComponent
  3. Spinne Entität mit ShowUpComponent
  4. Nach ShowUpComponent (von den ShowUpSystem) behandelt wird, um diese Komponente zu entfernen und ShootComponent
  5. abgeben ShootComponent ist behandelt (durch die ShootSystem), entfernen Sie diese Komponente und fügen Sie FleeComponent
  6. hinzu

Damit können Sie Feinde mit allen möglichen Komponentenkombinationen erstellen und Sie können mehrere Komponenten zu einer Entität hinzufügen.

Wenn Sie sich entscheiden, Kreisbewegung und permanenten Feuer Feind hinzuzufügen. Erstellen Sie einfach CircleMovementComponent und PermanentFireComponent und entsprechende Systeme.

+0

Trotz der Tatsache, dass die anderen Antworten ziemlich handlich sind, akzeptiere ich diese wegen des ** ECS ** -Musters - das ich bereits durch Ashley verwende, wie ich weise erwähnte - Danke euch allen! – sonirico

0

Deklarieren Sie eine abstrakte Klasse MoveType und eine abstrakte Klasse Monster.

Geben Monster Methode setPosition(int x, int y). Geben Sie MoveType ein Feld, das eine Variable des Typs Monster enthält. Make MoveType haben abstrakte Methoden zur Bestimmung, wie und wo auf der aktuellen Position, Spielerposition, etc. zu bewegen. Monster kann eine Methode namens move(), die die abstrakten Methoden ruft und dann ruft Monster.setPosition(), um die gewählte Bewegung zu implementieren.

Dann deklarieren Implementierungen von MoveType wie MoveA, MoveB, etc. Die sollten ihre eigene interne Logik verwenden, um zu bestimmen, wie man sich bewegt.

Stellen Sie sicher, erlauben Monster eine Methode zu haben, die Sie die Monster ‚s MoveType festlegen können.

Dieser Ansatz gibt Ihnen die Flexibilität, weitere Monster hinzuzufügen oder Typen zu verschieben, ohne die zugrunde liegende Struktur zu ändern. Alles, was Sie tun müssen, ist eine neue MoveType definieren, implementieren Sie die Logik für wohin zu verschieben, und übergeben Sie eine Instanz der neuen an eine Instanz von Monster. Sie könnten sogar den Bewegungstyp eines Monster in der Mitte des Spiels basierend auf einer Bedingung ändern (vielleicht, wenn es dem Spieler nahe genug kommt).

Ungeprüfte Beispiel unten, aber die Idee sollte fest sein:

public abstract class Monster { 
public int xPosition; 
public int yPosition; 

public MoveType move; 

public Monster(int x, int y, MoveType move) { 
    xPosition = x; 
    yPosition = y; 
    this.move = move; 
} 

public void setPosition(int x, int y) { 
    xPosition = x; 
    yPosition = y; 
} 

public void move() { 
    setPosition(move.determineXMove(), move.determineYMove()); 
} 
} 

-

public abstract class MoveType { 
public Monster monster; 

public MoveType(Monster monster) { 
    this.monster = monster; 
} 

public abstract void determineXMove(); 
public abstract void determineYMove(); 
} 

-

public class MoveLeft extends MoveType() { 
@Override 
public void determineXMove() { 
    return monster.xPosition - 1; 
} 

@Override 
public void determineYMove() { 
    return monster.yPosition; 
} 
} 

Mit der oben würden Sie ein Monster erklären, es vorbei ein neue Startposition und MoveLeft Objekt.Dann würden Sie fortwährend seine move() Methode innerhalb Ihrer Spielschleife benennen.

Verwandte Themen