2017-10-20 1 views
-4

Ich versuche, meine Entitäten zu löschen/kill, wenn sie außerhalb der "playzone" oder atleast gehen, was für den Benutzer sichtbar ist. Ich bekomme keine Fehler, aber als ich dieses Codebeispiel in der Funktion "killEdgeEntities" ausprobierte und das Spiel startete, wäre alles schon tot, als ob die "if-Anweisungen" direkt ausgeführt würden. Und nein, ich spawne nichts außerhalb der Argumente. Zum Beispiel wird der Benutzer Ship in der Mitte des Bildschirms angezeigt.C++ Kann nicht von Fehlern debuggen, aber keine Fehler im Code

Wenn Sie mehr Informationen benötigen, kommentieren Sie es einfach.

void Invaders::killEdgeEntities() { 
EntityVector entities; 
for (EntityVector::iterator j = mEntities.begin(); j != mEntities.end(); j++) { 
    Entity *entity = *j; 
    // * Dödsgränser * 
    // Vänster: 
    if (entity->getPosition().getX() < -20) { 
     delete entity; 
    } 
    // Höger: 
    if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) { 
     delete entity; 
    } 
    // Upp: 
    if (entity->getPosition().getY() < -80) { 
     delete entity; 
    } 
    // Ner: 
    if (entity->getPosition().getY() > VGCDisplay::getHeight() + 20) { 
     delete entity; 
    } 

} 
mEntities = entities; 
} 
+1

'entities' ist ein leerer Vektor. 'mEntities = entities;' macht 'mEntities' zu einem leeren Vektor, der all seinen vorherigen Inhalt verliert. Wolltest du etwas zu "Entitäten" hinzufügen? –

+1

_ "so krank sein Blick auf die Post in 30 min" _ Sie werden überrascht sein, wie schlimm Dinge in so kurzer Zeit werden können. – user0042

+1

Ihr Beitrag enthält ziemlich viel Hokuspokus. Sie zeigen besser ein [mcve] und beschreiben, was mit dem Code falsch ist, in dem Sinne, dass jemand verstehen kann, wer Ihr Spiel nicht kennt. – user463035818

Antwort

1

Nicht wirklich eine Antwort - da Sie nicht genug Code für uns geschrieben haben, um herauszufinden, was los ist ... aber Sie haben genug geschrieben, um Probleme zu sehen.

if (entity->getPosition().getX() < -20) { 
    delete entity; 
} 
// Höger: 
if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) { 

Was passiert, wenn Ihre x < -20 und Sie löschen Einheit? Sie versuchen, in der nächsten Zeile, die jetzt ein Fließkommazeiger ist (also nicht auf gültigen Speicher zeigt), darauf zuzugreifen ... und ein Absturz wartet darauf, zu passieren.

+0

Ye ich sehe was du sagst, vielleicht muss ich dann für jede if-Anweisung eine for-Schleife machen? Seitdem stört es die anderen nicht, denke ich. Ich werde es jetzt versuchen – fluxe

+0

@fluxe - Sie könnten dieses spezielle Problem mit einem "else if" lösen. Möglicherweise haben Sie jedoch immer noch denselben ungültigen Zeiger in "mEntities". –

+0

Sie entfernen auch nicht den Zeiger aus der Liste - was bedeutet, dass Sie sich für einen Absturz später ausrichten, den Sie nicht sehen werden ... die beste Lösung ist es, einen intelligenten Zeiger zu verwenden und dann die Elemente aus dem entfernen Liste (Löschen erfolgt automatisch) – UKMonkey

0

Dies löste mein Problem, indem ich am Ende einen else Batch machte, der eine Push_back auf die Entity zu EntityVector "entities" machte. Und dann nach der for-Schleife, um sicherzustellen, dass sie inline sind (parallell ich denke).

void Invaders::killEdgeEntities() { 

    EntityVector entities; 
    for (EntityVector::iterator i = mEntities.begin(); i != mEntities.end(); i++) { 
     Entity *entity = *i; 
     // * Dödsgränser * 
     // Vänster: 
     if (entity->getPosition().getX() < -20) { 
      delete entity; 
     } 
     // Höger: 
     else if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) { 
      delete entity; 
     } 
     // Upp: 
     else if (entity->getPosition().getY() < -80) { 
      delete entity; 
     } 
     // Ner: 
     else if (entity->getPosition().getY() > VGCDisplay::getHeight() + 20) { 
      delete entity; 
     } 
     else { 
      entities.push_back(entity); 
     } 
    } 
    mEntities = entities; 
} 
Verwandte Themen