Automatische Bewegung von 2D Spielfiguren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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...
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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. :)
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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:
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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)
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten