#1 28.03.2006 18:09:25

Dreamworld
UltraMember
Ort: Karlsruhe
Registriert: 06.12.2005
Beiträge: 368

Animationen steuern

Hi, hoffe das is der richtige Ort, unter DirektX fand ichs auch nich gerade passend  :?

Also, bei nem Strategiespiel müssen ja eine Vielzahl von Transformationen synchron vorgenommen werden.
Angenommen jede "Einheit" hat einen Index.

Wie bewältige ich am besten die Transformationen?

Ich dachte an einen "Animationscontroller", der Aufträge entgegennimmt und abarbeitet, bis der Zielpunkt erreicht ist, außer die Bewegung wird unterbrochen.
Da oft Hindernisse im Weg stehen, besteht die geplante Route aus 1+n Geraden. Eine Strecke könnte nach dem aus einem Record bestehen mit einem Zeiger auf eine neue Instanz des Records als weitere Gerade.

Naja, was ich euch fragen wollte, ob diese Methode gut ist/es bessere gibt/wie ihr das macht usw usw.

Danke sehr.

Offline

 

#2 28.03.2006 19:54:30

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Animationen steuern

Zitat:

hoffe das is der richtige Ort,

gold richtig smile

Statt der Gerade solltest du vielleicht einfach nur zunächst eine grobe Folge von Zielpunkten berechnen, die den ungefähren Weg angibt. Den Weg zum nächsten Zielpunkt berechnest du in alle paar Frames neu. (Folge von lokalen Zielpunkten) Dadurch kann das Fahrzeug dynamisch auf lokale Veränderungen (andere Fahrzeuge!) reagieren bei gleichzeitig halbwegs guter Performance.
Jedes Fahrzeug bewegst du in jedem Frame immer ein Stückchen auf den nächsten Zielpunkt zu.

Falls der letzte Zielpunkt erreicht ist, hält das Fahrzeug an.

Für die Performance solltest du vielleicht lieber keine verkettete Liste benutzen, sondern lieber dynamisches Array. Jedesmal wenn du die maximale Größe überschreitest verdoppelst du die Arraygröße.

Die frage ob du lieber einen "globalen" Controller benutzen solltest oder lieber die Methoden in das Fahrzeug selbst einbauen solltest, kann ich dir nicht beantworten ohne deine restliche Engine-Struktur zu kennen.

Aufjeden Fall solltest du nicht einfach drauflos coden, sondern vorher die Klassenstruktur planen, dass wird sonst nix!

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#3 29.03.2006 14:35:14

Dreamworld
UltraMember
Ort: Karlsruhe
Registriert: 06.12.2005
Beiträge: 368

Re: Animationen steuern

mhm..
also folgendes habe ich noch nicht kapiert.
Du sagst ich soll, wenn ich den ersten "Zielpunkt" erreicht habe den nächsten Zielpunkt errechnen.
Für was brauche ich dann ein dynamisches Array? Ich brauche ja quasi nur 2 Punkte, den nächsten Zielpunkt und den letzten Zielpunkt.
Vielleicht hab ich das auch falsch verstanden oder was nicht bveachtet.

Des weiteren wie frage ich ab, ob ein Objekt bewegt werden soll oder nicht? Jedes einzelne Objekt durchgehen und ein Boolean abfragen, ob bewegt werden soll oder testen, ob ein Zielpunkt vorliegt? Oder ein dynamischen Array für eine Auftragsliste mit den Indexen der Objekte und den durchgehn?
(war das doch der dynamische  :idea:  )

Dreamworld

Offline

 

#4 29.03.2006 16:13:14

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Animationen steuern

Ich glaube, Coolcat meint mehrere Waypoints für eine Fahrt.
Du hast 3 Autos, die haben alle aktuelle Positionen. Und nun bekommt Auto Nr.1 einen Fahrbefehl nach Punkt (127,433) oder so. Nun könntest Du Zwischenpunkte als Stützstellen berechnen. Wenn zum Beispiel ein großer Berg dazwischenliegt, ist es sinnlos, erst zum Berg zu fahren und dort zu merken daß es nicht weitergeht, sondern vorher schon leicht weiter links zu fahren.
Oder diese Stützstellen werden beim Kartenbauen vordefiniert, Marke CounterStrike.

Nun muß jedes Fahrzeug den nächsten Waypoint linear anfahren. Ist er da, wird auf den nächsten Waypoint gewechselt, wenn nicht, fahre ein Stück in die Richtung. War das der letzte Waypoint, is Schluß.

Möglicherweise mußt Du für jedes Fahrzeug ne Menge Variablen speichern, Ort, Zielort, alle noch kommenden Waypoints ... usw.
So schlimm wird das nicht sein, denke ich. Du mußt in jedem Frame pro Auto ein paar Abfragen machen, das ist okay.

@Coolcat: Ich hoffe, das deckt sich halbwegs mit Deiner Idee, nicht, daß wir zwei verschiedene Sachen erklären (will ja nicht deinen Vortrag hier kaputtmachen  big_smile )

Offline

 

#5 29.03.2006 16:17:23

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Animationen steuern

So mach ich das:

Ein Objekt dass bewegt werden muss, bekommt einen Path von meinem Pathfinder zugewiesen. Array of TPoint o.ä.

Ein Interger zeigt dann auf das nächte element im array zu dem bewegt werden muss. ist der integer >= arraygröße ist mein objekt am ziel.

und jetzt kommt noch ein kleiner Trick.

Ich berechnen den MoveVektor NICHT so:
pseudocode:

MoveVec = (Pos - ZielPos)* speed * timekey
Pos = Pos + MoveVec;
if abstand(pos, ZielPos) < 0.1 then
begin
  inc(ZielInt)
  ZielPos = Ziellaray[ZielInt];
end;

da es sein, kann dass man bei niedrigen fps man über den Zielpunkt 'hinausschießt' und im nächsten frame bewegt sich das Objekt wieder rückgängig.

Der bessere ansatz besteht einfach darin zu speichern vieviel Prozent des Weges zum zielPunkt schon zurückgelegt wurden.
Diesen wert dann jeden Frame um Speed*Timekey erhöhen.
Wenn der Wert >= 100 dann setzt du den nächsten ZielInt und setzt den wert auf
WegInProzent = WegInProzent - 100%;
dann sind die übrigen prozent gleich mit dabei und kein weg muss doppelt und dreifach gelaufen werden, weil man über das Ziel hinausschießt.
und das Platzieren dann eben

Pos = LetztePos + WegInProzent * Abstand(LetzerPunkt,NächsterPunkt);

so habe ich das gelöst.

Die Bewegungen behandelt ein Übergeorneter Bewegungsmanager, da ja jede bewegung gleich verläuft. Bei Flugeinheiten o.ä. muss man nur den Pathfinder abschalten und einfach Ziel und Endpunkt ins array schreiben.

Falls es fragen gibt, melde dich ruhig.

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#6 29.03.2006 16:41:08

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Animationen steuern

@Chris:
Wenn du deinen Pseudocode wie folgt abänderst, dürfte es auch funzen und zwar ohne deine
komischen Prozentwerte...

Code: delphi

movevec := (pos - zielpos) * speed * timekey;
if lengthsq(movevec) < epsilon*epsilon then
begin
    inc(zielint);
    zielpos := ziellaray[zielint];
end
else begin
    pos := pos + movevec;
end;



@DerPeer:
Jep, so ungefähr. Ich meinte halt, dass du zwei Listen mit Waypoints brauchst. Eine grobe Liste bei deren Berechnung keine beweglichen Objekte miteingeflossen sind und eine feine Liste die aber nur bis zum nächsten Waypoint führt. Die grobe wird nur einmal berechnet. Die feine wird jedes Frame neuberechnet, was jedoch schnell geht, da die Strecke bis zum nächsten Waypoint ja nur kurz ist.

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#7 29.03.2006 17:13:18

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Animationen steuern

Die komischen Prozentwerte nimmt er Dir jetzt sicher übel  lol

Offline

 

#8 30.03.2006 15:35:06

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Animationen steuern

ein eben nicht... mit einem epsilon gehts nicht.
stell dir vor, der timekey wird 1 dann bewegt man sich über das Ziel hinaus.

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#9 30.03.2006 16:57:31

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Animationen steuern

hm, achso.....*verpeilt....trotzdem find ich deinen Prozentwert komisch  :p


My software never has bugs. It just develops random features.

Offline

 

#10 30.03.2006 18:45:10

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Animationen steuern

Geht aber wunderbar. Muss ja nicht Prozent sein, mann man ja auch einfach in abhängigkeit der weglänge berechnen...
Aber so gehts besser als mit epsilon.

:mrgreen:

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson