Zurück   Flashforum > Flash > Flash Fortgeschritten > Flash 8

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 28-10-2008, 23:47   #1 (permalink)
Eierkopf
 
Benutzerbild von themerx
 
Registriert seit: Jul 2008
Ort: Hagen
Beiträge: 207
mehrere Kollisionen sparsam erstellen (Tower Defence Game) ?!?

Hallo,

ich baue mir gerade ein Tower Defence Game (kurze Erläuterung: eine gewisse Anzahl von Gegnern laufen eine Route ab und dürfen das Ende der Route nicht erreichen. Man kann Waffen bauen, die eine gewisse Reichweite haben, um die Gegner zu zerstören).

Nun ist es so, dass die Gegner ihren Weg laufen und ich auch die Waffen setzen kann. Ich muss nun abfragen, wann "welcher" Gegner in den Bereich von einer Waffe ist. Dazu muss ich kurz erklären, wie ich meine Waffen und meine Gegner erstelle und bezeichne.

Gegner:
Die Gegner werden automatisch erstellt. Insgesamt 20 Stück die nacheinander per attachMovie an das Objekt "game.clip" gehängt wird. Sie tragen dann folgende Namen.

game.clip["gegner" + 1]
game.clip["gegner" + 2]
game.clip["gegner" + 3]
...usw


Waffe:
Die Waffen werden per Befehl erzeugt und werden ebenfalls an "game.clip" angehängt. Die haben dann die Namen.

game.clip["waffe" + 1]
game.clip["waffe" + 2]
game.clip["waffe" + 3]


Jetzt komm ich wieder zum eigentlichen Problem. Angenommen Gegner 4 gerät jetzt an Waffe 3, dann soll natürlich Waffe 3 auf Gegner 4 schießen. Um das zu realisieren muss ja immer abgefragt werden, welcher Gegner nun an welche Waffe gerät. Bis lang mache ich das so:

HTML-Code:
onEnterFrame = function()
{
   for (i=0; i<anzahl_gegner; i++)
   {
      for (j=0; j<anzahl_waffen; j++)
      {
         if(game.clip["gegner" + i].hitTest(game.clip["waffen" + j]))
         {
            // hier kommt nun ein Script rein, welches den Schuss 
            // von der Waffe zum Gegner ausführt
         }
      }
   }

}
Einige merken schon, dass hier pro Frame eine Schleife in einer Schleife ausgeführt wird. Bei 20-30 Waffen und 20 Gegnern fängt das natürlich schon an zu ruckeln.
Gibt es da eine einfachere Möglichkeit?

Danke und lieben Gruß
M.R.
themerx ist offline   Mit Zitat antworten
Alt 29-10-2008, 08:12   #2 (permalink)
poke
 
Registriert seit: Dec 2002
Ort: Iserlohn [NRW]
Beiträge: 2.304
Da du TDs oft so sind, dass Tower eine bestimmte radiale Reichweite haben, reicht es sicherlich einfach den Abstand des Gegners (Mittelpunkt) zum Tower (Mittelpunkt) zu berechnen. Eine solche Abstandsformel hat man ja schon in der Schule gelernt, und geht sicher viel viel schneller als ein Hittest:
Code:
d = SQRT( ( y2 - y1 )² + ( x2 - x1 )² )
pokepika ist offline   Mit Zitat antworten
Alt 29-10-2008, 10:00   #3 (permalink)
Eierkopf
 
Benutzerbild von themerx
 
Registriert seit: Jul 2008
Ort: Hagen
Beiträge: 207
stimmt, das wäre schon eine gute möglichkeit, aber dass muss ich trotzdem in einer schleife abfragen, oder?

Also ich meinte, dass ich diese formel eigentlich zwischen jedem gegner und jeder waffe IMMER gleichzeit laufen lassen muss, richtig? das sind auch wieder viele berechnungen. oder ist das wirklich so viel sparsamer als der hittest, dass das egal ist?

Geändert von themerx (29-10-2008 um 10:03 Uhr)
themerx ist offline   Mit Zitat antworten
Alt 29-10-2008, 10:22   #4 (permalink)
ich versuchs ja
 
Benutzerbild von netterkerl1981
 
Registriert seit: Sep 2007
Ort: Kassel
Beiträge: 281
Moin moin...

Eine Idee:
Du könntest erst die Abfrage in einer schleife (oft) ausführen. Wenn dann ein Gegner in der Reichweite ist, feuerst du und wartest bis die waffe nachgeladen ist, um dann wieder (oft) nachzufragen...
So könntest du zumindest etwas die Abfragen verringern..
Ob das allerdings DIE Lösung ist -> keine Gerantie :-)

PS: Wenns fertig ist, schick mal den Link durch den Äther. Bin für sowas immer gern zu haben :-)
__________________
Zitat:
Eigentlich bin ich ganz anders. Ich komm nur viel zu selten dazu.
Udo Lindenberg und Jan Delay
netterkerl1981 ist offline   Mit Zitat antworten
Alt 29-10-2008, 10:26   #5 (permalink)
Eierkopf
 
Benutzerbild von themerx
 
Registriert seit: Jul 2008
Ort: Hagen
Beiträge: 207
Zitat:
Zitat von netterkerl1981 Beitrag anzeigen
Moin moin...

Eine Idee:
Du könntest erst die Abfrage in einer schleife (oft) ausführen. Wenn dann ein Gegner in der Reichweite ist, feuerst du und wartest bis die waffe nachgeladen ist, um dann wieder (oft) nachzufragen...
So könntest du zumindest etwas die Abfragen verringern..
Ob das allerdings DIE Lösung ist -> keine Gerantie :-)

PS: Wenns fertig ist, schick mal den Link durch den Äther. Bin für sowas immer gern zu haben :-)
habe schon eine version online.
http://www.stevie-mycs.de/games/lase...serdefence.htm


da laden die Waffen allerdings nicht nach, sondern laufen die ganze Zeit, sobald ein gegner in den Waffenbereich kommt.

Geändert von themerx (29-10-2008 um 10:28 Uhr)
themerx ist offline   Mit Zitat antworten
Alt 29-10-2008, 13:35   #6 (permalink)
Eierkopf
 
Benutzerbild von themerx
 
Registriert seit: Jul 2008
Ort: Hagen
Beiträge: 207
also, den Code, den ich jetzt habe ist, dank eurer Hilfe schon echt sehr gut. Ich lasse das Spiel nun mit 30 FPS laufen. Die Abstände zwischen den Gegnern und den Waffen werden berechnet. Es laufen 25 Gegner und ich hab mal auch so ca 20 - 30 Waffen gebaut. Die FPS lasse ich mir anzeigen und es gibt auch keinerlei - bis sehr geringe Verluste an FPS.
Ich mache es nun so, dass der erste Gegner, der in den gewollten Abstand gerät, in einer Variablen eingefangen wird und dort soll nun auf den Gegner geschossen werden.
Wenn ich aber nun einen "Laser" erzeuge, der dauerhaft (also so lange, wie der eingefangene Gegner im Range ist) auf den Gegner strahlt, wird das Spiel wieder langsamer.
Ich erzeuge den laser mit:

_root.game.clip.attachMovie("laser_mc","laser_mc"+ i, i+1700);

dann
moveTo(waffe._x, waffe._y)
lineStyle(...)
lineTo(gegner._x, gegner._y)

gibt es da auch ne bessere Alternative?

Schaut mal bei dem Game. Da läuft das auch flüssig mit sogar noch viel mehr Gegnern.
http://www.candystand.com/play.do?id=18047
themerx ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele