Seite 2 von 5

Verfasst: 16.02.2007 21:10
von STARGÅTE
Um noch mal auf das wackeln zurück zukommen :

das Prob liegt hir

Code: Alles auswählen

Bot_w = Bot_w + Bot_dw 
und hier

Code: Alles auswählen

If Unterschied > 0 And Unterschied <= 180 : Bot_dw = 2+Unterschied/10 : EndIf 
If Unterschied < 0 And Unterschied >= -180 : Bot_dw = -2+Unterschied/10 : EndIf
Wenn das ziel immer näher kommt dann können schon keine Positionsveränderungen zu einer extremen Winkeländerung führen. (Unterschied)
was zur folge hat, dass die Winkelgeschwindigkeit (Bot_dw) kurz schnell ansteigt und damit dann der Winkel (Bot_w) sich ruckartig ändert.

Problemlösung:

Da steht ja zB Bot_dw = 2+Unterschied/10, wass bedeutet das die Winkelgesch. auf jedenfall 2 ist, was eigendlich unnötig ist wenn das dein schiff schon fast den richtigen winkel hat, du kannst also das machen :

Code: Alles auswählen

If Unterschied > 0 And Unterschied <= 180 : Bot_dw = Unterschied/10 : EndIf 
If Unterschied < 0 And Unterschied >= -180 : Bot_dw = -Unterschied/10 : EndIf
Dann ist die drehbewegung noch schöner und ruckelfrei

Verfasst: 17.02.2007 21:04
von Vermilion
Naja, das mit dem Beschleunigen und Abbremsen habe ich jetzt nicht wirklich nötig bzw. nicht wirklich geplant einzubauen.

Danke wieder, werds verbessern...

Verfasst: 18.02.2007 00:04
von STARGÅTE
sagen wir mal soooo,

Klar ist eine beschleunigung etwas überflüssig aber:

1. Die Bewegung sieht besser aus (nicht so ruckartig wenn er los fliegt)
2. Du hast einen neuen Parameter für dein Spiel (wie schnell jedes Flugzeu geschleunigt)

Verfasst: 18.02.2007 20:08
von Scarabol
Scheint so als käme Stargate nicht damit zurecht das man nicht von seinen Sachen begeistert ist, weil sie einfach nur zu kompliziert !für den Anfang! sind. :)

Verfasst: 18.02.2007 20:21
von Vermilion
lol

Naja, zum Trost für Stargate: Die Beschleunigung hebe ich mir für später auf, hauptsache die Figuren bewegen sich erstmal überhaupt und richtig. :wink:

Verfasst: 18.02.2007 20:29
von Kaeru Gaman
es ist auch ne frage, was für figuren das sind.

bei fußtruppen sähe beschleunigt und im bogen schon ein wenig merkwürdig aus.....

Verfasst: 18.02.2007 20:44
von STARGÅTE
jetzt könnte ich wieder etwas aus der Physik zitieren, aber ich halte mich jetzt mal zurück ....

Macht was ihr wollt ^^

Verfasst: 20.02.2007 20:29
von Vermilion
So, da bin ich wieder! :D

Schon das nächste Problem:

Ich hatte es so geplant, dass wenn man mehr als eine Figur auswählt, oben links in der Ecke Tiles für jede einzelne Figur erscheinen. Durch anklicken eines Tiles konnte man die eine Einheit auswählen und die anderen deselektieren. Das hatte den Sinn, dass wenn mehrere Figuren auf einem Punkt sind, man auch die einzelnen erfassen kann, und nicht gleich alle. Nun habe ich es einfach nicht gebacken gekriegt.
Deshalb dachte ich mir, ich machs einfach anders, ich lasse es gar nicht erst dazu kommen, dass sich die Sprites auf dem selben Punkt befinden bzw. überlappen. Bloß wie schaffe ich das?

*ZuStargateSchiel* 8)

Verfasst: 21.02.2007 00:18
von STARGÅTE
E() ist hier die LL in der alle Einheiten drine sind.
Dann wird jede Einheit mit jeder verglichen und bei kollision werden sie soweit auseinander geschoben das sie sich gerade nicht berühren.

Code: Alles auswählen

#b = 0.01745329 ; Unrechnungsfaktor von Grad zu Bogenmaß

Procedure.f Abstand(x1, y1, x2, y2)
 r.f = Sqr(Pow(x1-x2,2)+Pow(y1-y2,2))
 ProcedureReturn r
EndProcedure

Procedure.f Winkel(x,y)
 Winkel.f
 If x = 0
  If y <  0 : Winkel = -90 : EndIf 
  If y >= 0 : Winkel =  90 : EndIf 
 Else 
  Winkel = ATan(y/x)/#b 
  If x < 0 : Winkel + 180 : EndIf 
 EndIf 
 ProcedureReturn Winkel
EndProcedure

 ResetList(E())
 While NextElement(E())  
   *E = @E()
   E_G = G ; Radius der Figur
   E_x = E()\x ; x-Position
   E_y = E()\y ; y-Position
   ResetList(E())
   While NextElement(E())  
    If @E() <> *E
     d = Abstand(E()\x, E()\y, E_x, E_y)
     If d < E()\G+E_G
      dex = E_x-E()\x 
      dey = E_y-E()\y 
      Winkel = Winkel(dex, dey)
      E()\x = E()\x - Cos(Winkel*#b)*(E()\G+E_G-d)   
      E()\y = E()\y - Sin(Winkel*#b)*(E()\G+E_G-d)   
     EndIf
    EndIf
   Wend
   ChangeCurrentElement(E(), *E) 
 Wend
Wenn du willst schicke ich dir mal ein kleines Programm in der die "Wurzel" des Strategiespiels ist, also einheiten anklicken, und bewegen

Verfasst: 21.02.2007 04:11
von Kaeru Gaman
> bei kollision werden sie soweit auseinander geschoben das sie sich gerade nicht berühren.
auch keine schlechte idee.
fein-plazierungs-freundlicher, aber evtl auch recht rechenintensiv...

bei vielen älteren games ist das so gelöst,
dass nur eine einheit pro tile plaziert werden kann,
bzw. bei wesentlich größeren tiles,
dass diese in virtuelle sub-tiles aufgeteilt sind,
wo wiederum nur eine einheit pro sub-tile stehen kann.
also, z.b. wenn ein tile 3x so breit ist wie eine einheit,
wird sie in 3x3 subtiles gesplittet.
die einheiten bewegen sich zwar weich pixelweise,
aber zielpunkte/standpunkte gibt es nur diese 9 pro tile.
auch bei der wegfindung sind subtiles von anderen einheiten "besetzt",
so dass die bewegende einheit entweder umgehen muss,
oder die plazierte einheit um ein subtile ausweicht.

früher hatte man einfach nicht die rechen-power um so
scherze zu machen mit dynamischem auseinanderrücken.
heutzutage kann man durchaus auch bei 2D-games berechnungen verwenden,
wie sie eigentlich eher in 3D-umsetzungen anwendung finden.

...das ist dann einer der gründe, wo der laie sich fragt, warum das prog soviel power braucht... ;)