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