Seite 1 von 1

Rotation ändern mit faktor (abhängig der differenz)

Verfasst: 01.07.2015 10:15
von True29
sorry für die komische frage stellung wusste nicht genau wie ich das formuliere ;)

hier mein problem.

ich habe eine einheit welche wegpunkten folgt (A*) z.b von feld A > B läuft. feld A hat den winkel 0 feld B = 30.
nun ändert die einheit momentan den winkel sofort auf 30 anstatt dies langsam.
Nun wäre es schön wenn diese änderung des winkels wie schnell sie statt findet (faktor) abhängig wäre von der differenz des winkels. also heißt diferenz wie oben 30° dauert genau so lange wie 60 oder 90°.
Sonst läuft meine einheit nicht mehr den weg vielleicht.

Beispiel code hierzu habe ich noch keinen.

danke für vorschläge.

grüße.

Re: Rotation ändern mit faktor (abhängig der differenz)

Verfasst: 01.07.2015 11:41
von Kukulkan
Winkeländerung je Schritt = Gesamt Winkeländerung / Gesamt Schrittanzahl

Beispielsweise ein Weg von 50 Pixel zu gehen mit +30° Änderung

wS = 30 / 50

Dann je Schritt den Winkel um wS anpassen (addieren).

Ach ja, wS sollte natürlich ein Float sein :-)

Re: Rotation ändern mit faktor (abhängig der differenz)

Verfasst: 01.07.2015 11:50
von True29
danke , wird gleich getestet ;)

Re: Rotation ändern mit faktor (abhängig der differenz)

Verfasst: 01.07.2015 12:14
von True29
hab hier mal ein beispiel code mit deinem vorschlag gebaut,
klappt noch nciht so ganz vielelicht kannst du mal drüberschauen danke :(
er läuft leider am ziel vorbei ;)

Code: Alles auswählen


EnableExplicit

Procedure GET_DISTANCE(Sx,Sy,Tx,Ty)    
 ProcedureReturn Sqr((Sx - Tx)*(Sx - Tx)+(Sy - Ty)*(Sy - Ty))                
EndProcedure

Procedure FIND_PLAYER(*start.point,*ziel.point)
  ;// return degree      
    ProcedureReturn Degree(ATan2(*ziel\x-*start\x,*ziel\y-*start\y)) 
EndProcedure
  
Procedure.f gSin(Ang.f) 
  ProcedureReturn Sin(Radian(Ang))
EndProcedure

Procedure.f gCos(Ang.f)
  ProcedureReturn Cos(Radian(Ang))
EndProcedure

Define.f alterotattion,neuerotation,aktuellerotation,winkela,MoveSpeed,dwtime1,dwTime2,ftime,vx,vy
Define start.point
Define ziel.point


start\x = 0.0
start\y = 20

ziel\x = 80
ziel\y = 80

alterotattion = 0
neuerotation = 0
MoveSpeed = 10

Repeat
  dwtime1 = ElapsedMilliseconds() 
  
  ;// winkel anpassen
  winkela = FIND_PLAYER(start,ziel) / GET_DISTANCE(start\x,start\y,ziel\x,ziel\y)
  Debug start\x
  Debug start\y
Debug "distance" + StrF(GET_DISTANCE(start\x,start\y,ziel\x,ziel\y),2)
  
  
  ;// einheit bewegen
  vx = gCos(winkela) * MoveSpeed
  Vy = gSin(winkela) * MoveSpeed
  start\x + Vx * ftime.f 
  start\y + Vy * ftime.f       
  
  dwTime2 = ElapsedMilliseconds() 
  ftime = (dwtime2 - dwtime1) / 1000.0    
  ;// repeat until distance kleiner 5
  
Until GET_DISTANCE(start\x,start\y,ziel\x,ziel\y) < 5

Re: Rotation ändern mit faktor (abhängig der differenz)

Verfasst: 01.07.2015 12:51
von Kukulkan
Leider hab ich nicht die Zeit um mit dem Code zu spielen. Aber in Kürze:

Nutze nicht .point, denn das sind nur integer. Mach deine eigene Struktur. zB

Code: Alles auswählen

Structure strPlayer
  x.f
  y.f
  winkel.f
EndStructure
Weiterhin würde ich den aktuellen Winkel in die Struktur mit aufnehmen. Besser wäre auch Start und Endposition:

Code: Alles auswählen

Structure strPos
  x.f
  y.f
  winkel.f
EndStructure

Structure strPlayer
  start.strPos ; StartPosition
  ziel.strPos   ; EndPosition
  aktuell.strPos ; aktuelle Stände während der Bewegung
EndStructure
So kannst Du das später auch für mehr Spielfiguren (Player oder Computerfiguren) verwenden.

Vermutlich musst Du da noch mehr reintun. Zum Beispiel die individuellen Zähler, Schrittweiten etc.

Auch musst Du dir überlegen ob die Spielfigur sich nur langsam in die neue Position drehen soll während sie auf direktem Weg zum Ziel geht (Linie) oder ob die einen Bogen entsprechend dem gerade aktuellen Winkel gehen soll (schwieriger).

Mehr kann ich momentan Zeitlich nicht machen. Sorry.

Grüße,

Kukulkan

Re: Rotation ändern mit faktor (abhängig der differenz)

Verfasst: 01.07.2015 13:22
von True29
ok , ist ja nur ein beispiel code.

gut danke ich probier weiter.

"Auch musst Du dir überlegen ob die Spielfigur sich nur langsam in die neue Position drehen soll während sie auf direktem Weg zum Ziel geht (Linie) oder ob die einen Bogen entsprechend dem gerade aktuellen Winkel gehen soll (schwieriger)."

dieses problem wollte ich ja u.a mit dieser aktuellen lösung angehen ;)

Re: Rotation ändern mit faktor (abhängig der differenz)

Verfasst: 01.07.2015 13:53
von True29
nun habe ich den code mal so gemacht das er zum ziel läuft , jedoch ist nun dein beispiel nicht integriert.
man müsste nun noch irgendwie die player\aktuell\winkel integrieren wo Winkeländerung je Schritt = Gesamt Winkeländerung / Gesamt Schrittanzahl berechnet wird.

Code: Alles auswählen

EnableExplicit

Structure strPos
  x.f
  VX.f
  y.f
  VY.f
  winkel.f
EndStructure

Structure strPlayer
  start.strPos ; StartPosition
  ziel.strPos   ; EndPosition
  aktuell.strPos ; aktuelle Stände während der Bewegung
EndStructure

Procedure.f GET_DISTANCE(Sx,Sy,Tx,Ty)    
 ProcedureReturn Sqr((Sx - Tx)*(Sx - Tx)+(Sy - Ty)*(Sy - Ty))                
EndProcedure

Procedure.f FIND_PLAYER(sx,sy,tx,ty)
  ;// return degree      
    ProcedureReturn Degree(ATan2(tx-sx,ty-sy)) 
EndProcedure
  
Procedure.f gSin(Ang.f) 
  ProcedureReturn Sin(Radian(Ang))
EndProcedure

Procedure.f gCos(Ang.f)
  ProcedureReturn Cos(Radian(Ang))
EndProcedure


Define.f MoveSpeed,dwtime1,dwTime2,ftime,vx,vy
Define Player.StrPlayer

Player\start\x = 0.0
player\start\y = 20
player\start\winkel = 0

Player\ziel\x = 80
Player\ziel\y = 80
Player\ziel\winkel = 0

MoveSpeed = 10

Repeat
  dwtime1 = ElapsedMilliseconds() 
  
  ;// winkel anpassen fehlt noch
  player\aktuell\winkel = FIND_PLAYER(player\aktuell\x,player\aktuell\y,player\ziel\x,player\ziel\y) / GET_DISTANCE(player\aktuell\x,player\aktuell\y,player\ziel\x,player\ziel\y)
  
  Debug GET_DISTANCE(player\aktuell\x,player\aktuell\y,player\ziel\x,player\ziel\y)
  
  ;// einheit bewegen
  player\aktuell\VX = gCos(FIND_PLAYER(player\aktuell\x,player\aktuell\y,player\ziel\x,player\ziel\y)) * MoveSpeed
  player\aktuell\VY = gSin(FIND_PLAYER(player\aktuell\x,player\aktuell\y,player\ziel\x,player\ziel\y)) * MoveSpeed
  player\aktuell\X + player\aktuell\VX * ftime.f 
  player\aktuell\Y + player\aktuell\VY * ftime.f       
  
  dwTime2 = ElapsedMilliseconds() 
  ftime = (dwtime2 - dwtime1) / 1000.0    
  ;// repeat until distance kleiner 5
  
Until GET_DISTANCE(player\aktuell\x,player\aktuell\y,player\ziel\x,player\ziel\y) < 5

Re: Rotation ändern mit faktor (abhängig der differenz)

Verfasst: 01.07.2015 14:06
von True29
update:
normal bekommt die einheit die Zielrotation von dem A* Algo für das nexte feld.
Die EInheit dreht sich dann halt sofort dorthin sozusagen.

Re: Rotation ändern mit faktor (abhängig der differenz)

Verfasst: 01.07.2015 15:26
von True29
@Kukulkan wenn du zeit hättest können wir vielleicht mal kurz skypen ?
würd dir das ganze gerne mal am game zeigen.
wäre super ;)
vielleicht ist das hier auch der falsche weg für mich.

grüße.

Re: Rotation ändern mit faktor (abhängig der differenz)

Verfasst: 02.07.2015 23:34
von True29
schade , bin meinem problem immer noch nicht näher gekommen :(

momentan ist der ansatz den ich versuch dieser .
ich bilde eine differenz also
winkeldifferenz = sollwinkel - winkel
v = sollWinkelDifferenz/Zeit
v sollte dann der faktor sein mit dem sich die einheit drehen soll um den ziel winkel zu erreichen.
anscheinend ist noch ein denkfehler drin .
die einheit dreht sich irgendwie zu langsam.
vielleicht gibt es noch einen besseren ansatz ?

danke.