2016-09-01 2 views
3

I Small/Mid RTS-Spiel mache, ich habe folgendes notwendig:SpriteKit Ranges Detect

Ich möchte gegnerische Spieler Verbündeten angreifen und umgekehrt, wenn sie in jedem Angriff Bereich.

Meine Frage ist: Was wäre ein besserer Ansatz zu finden, ob gegnerische Einheiten in Angriffsreichweite von Verbündeten sind oder umgekehrt?

Was habe ich versucht:

Vorerst habe ich versucht SKNodes mit SKPhysicsBodies für jede Einheit Knoten hinzuzufügen.

Ich kann sehen, dass FPS gehen, wenn der Kontakt passiert ... Ich denke, es war nicht der beste Weg zu erkennen, ob Feinde in Reichweite sind.

Ich denke, meine Alternative besteht darin, eine Nested Loop innerhalb der Update-Methode zu starten und zu prüfen, ob es gegnerische Einheiten innerhalb des Radius gibt. Ich bin nicht sicher, ob es der beste Ansatz ist, aber mit diesem Ansatz kann ich mit einigen Parametern spielen und vielleicht die Routine für meine eigenen Bedürfnisse optimieren.

Ich würde gerne wissen, ob es bessere Alternativen gibt.

Antwort

2

Blick in GamePlayKit,

Es kann einige Dinge, die Sie wollen.

Ansonsten würde ich einfach die euklidische Distanzformel https://math.stackexchange.com/questions/139600/euclidean-manhattan-distance ohne die Quadratwurzel verwenden und diesen Wert basierend auf Trupps, nicht einzelnen Truppen verwenden. (Wenn also eine Gruppe von 4 Soldaten einen Feind von 5 Soldaten angreift, wird nur 1 Distanz überprüft).

Der Grund, warum Sie nicht Quadratwurzel, ist, weil Sie den quadratischen zulässigen Abstand wissen sollten. Wenn ein 10 Pixel entfernter Gegner Soldaten anlockt, dann 100.

Der beste Weg, deine Soldaten wie Squads zu behandeln, fügen Sie sie alle zu einem SKNode (Unterklasse, um bessere Funktionalität hinzuzufügen), dann müssen Sie nur diese Gruppe vergleichen SKNodes

Wenn Sie die Anzahl der von Ihnen vorgenommenen Überprüfungen verringern möchten, sollten Sie Ihren Spielbereich in ein Raster (wie ein Schachbrett) verwandeln. Da Sie die Größe Ihrer Kacheln kennen, können Sie leicht überprüfen, ob die Einheiten nah genug sind, um eine Abstandsprüfung zu rechtfertigen. Z.B. Du hast eine Einheit bei a1, und einen Feind bei i9, dann weißt du, dass die Einheiten zu weit voneinander entfernt sind, um sich gegenseitig anzugreifen

+0

Vielen Dank für deine Antwort, Ich habe einige Kämpfe mit Einheiten für verbündete Einheiten (Ich erlaube dem Benutzer, die Einheiten einzeln oder dynamisch zu steuern). Feindliche Einheiten werden in der Tat von festen Einheiten angegriffen. Danke für die Entfernungsvorschläge – ColdSteel

+0

Sie halten einfach einen Stapel Kaderknoten griffbereit und verwenden die 'moveToParent' Methode, um zwischen ihnen zu wechseln – Knight0fDragon

+0

Ich schätze, es passt einfach nicht in mein Gameplay (Ich möchte die Einheitssteuerung erreichen wie es war in Myth2 Spiel). In jedem Fall habe ich den Großteil Ihres Vorschlags umgesetzt. Ich überprüfe für jede Einheit, wie weit sie von der gegnerischen Truppe entfernt ist. Wenn sie in Reichweite ist, greift sie an, wer immer im gegnerischen Trupp ist. Ich rufe diese Überprüfung auf einen Hintergrund Thread von der - Update-Methode ...aber wenn ich kein Shield Window nenne, sind die fps ungefähr 40 und ich habe nur 11 Einheiten 1 freundlich und 10 Feinde in 1 Squad :-( – ColdSteel