2017-03-26 6 views
2

Ich habe gelesen und verstanden, was der Fehler selbst bedeutet und im Allgemeinen wie man es löst, aber ich bin nicht sicher, wie in dem Fall wo Ich erstelle zwei verschiedene Sätze von Instanzen aus zwei verschiedenen Klassen (Vergleiche, ob zwei Rechtecke kollidieren), und wenn sie dies tun - verschiebe einen von den anderen.Nicht-statische Methode aus einem statischen Kontext [Vergleich zweier Klassen von Klasseninstanzen]

public class NPCManager { 

public NPCManager(int amountNPC, int NPCGap) { 
    // 
    populateNPCS(); 
} 

public void update() { 
    for(RectNPC NPC : monsters) 
     if(ObstacleManager.NPCCollide(NPC.getRectangle())) { //NPCCollide is the error 
      // 
     } 
} 

(oben) Dies ist die Klasse, die Instanzen von NPCs zu schaffen, sollte es jeden NPC überprüft unter Verwendung des Verfahrens gezeigt.

public class ObstacleManager { 

public ObstacleManager(int playerGap, int obstacleGap, int obstacleHeight, int color, int doorcolor) { 

    populateObstacles(); 
} 

public boolean NPCCollide(RectNPC NPC) { 
    for(Obstacle ob : obstacles) { 
     if(ob.NPCCollide(NPC)) 
      return true; 
    } 
    return false; 
} 

(oben) Dies ist die Klasseninstanzen der Hindernisse zu schaffen, sollte es prüfen, ob die NPC kollidiert durch die unten.

public class Obstacle implements GameObject { 

public Obstacle(int rectHeight, int color, int doorColor, int startX, int startY, int playerGap) { 
    // 
} 

public boolean NPCCollide(RectNPC NPC) { 
    /* Checks if the NPC inputted collides with the rectangles */; 
} 

(Above) Die Klasse für die Erstellung der Hindernisse selbst.

Die Manager werden verwendet, wenn das Spiel neu gestartet wird, kann es wie erwartet neu gestartet werden.

+0

Sie müssen 'NPCCollide' auf einer Instanz von' ObstacleManager' nennen. Es hängt davon ab, ob das bedeutet, dass (1) 'update' dieses Objekt als Parameter nimmt, (2) es als Instanzfeld behält oder (3) das Objekt innerhalb von' update' erstellt. – 4castle

Antwort

2

Es ist schwer herauszufinden, was Sie mit dem Code meinen. (Die Code-Stil Verletzungen nicht helfen!)

Aber ich denke, Sie zu fragen, wie diese Arbeit zu machen:

for(RectNPC NPC : monsters) 
    if(ObstacleManager.NPCCollide(NPC.getRectangle())) { 
     //NPCCollide is the error 
     // 
    } 

Das Problem ist, dass NPCCollide (igitt Stil Verletzung!) Ist eine Instanzmethode . Das heißt, Sie müssen es für eine Instanz aufrufen. Aber ObstacleManager ist eine Klasse.

Lösung: Erstellen Sie eine Instanz der ObstacleManager Klasse und rufen Sie die Instanzmethode für diese Instanz auf.

Ihre Anwendung erfordert jedoch fast sicher, dass es nur eine Instanz der ObstacleManager gibt.

Lösung (Teil 2): ​​Lesen Sie auf dem "Singleton" Design-Muster, und verwandeln Sie Ihre ObstacleManager in eine Singleton-Klasse.

Referenzen:

+0

Vielen Dank für die Hilfe trotz der Verstöße, es hilft wirklich. Ich wollte auch hinzufügen, dass ich eine Getter-Methode brauchte, um die Liste von der NPCManager-Klasse zu bekommen, wie ich es nannte, ohne dies zu tun - jetzt zu testen, aber scheint derzeit gut zu funktionieren. – George

Verwandte Themen