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

Für allgemeine Fragen zur Programmierung mit PureBasic.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

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

Beitrag 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.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

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

Beitrag 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 :-)
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

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

Beitrag von True29 »

danke , wird gleich getestet ;)
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

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

Beitrag 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
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

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

Beitrag 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
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

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

Beitrag 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 ;)
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

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

Beitrag 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
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

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

Beitrag 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.
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

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

Beitrag 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.
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

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

Beitrag 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.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Antworten