schnellster weg von A nach B
schnellster weg von A nach B
hallo,
wie kann man ein sprite so bewegen, dass es immer den kürzesten weg zu zwei anderen koordinate nimmt (ich mein das es sich sichtbar dorthin bewegt)?
wie kann man ein sprite so bewegen, dass es immer den kürzesten weg zu zwei anderen koordinate nimmt (ich mein das es sich sichtbar dorthin bewegt)?
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Der schnellste Weg ist immer Luftlinie. Gibt es Hindernisse denen das Sprite ausweichen muss, muss man eventuell Wegfindungs - Algos einsetzen?
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Luftlinie:
du nimmst die Differenz zu den Zielkoordinaten, und teilst das durch die Anzahl Frames die du brauchen willst.
diese quotienten speicherst du in zwei variablen, zum beispiel SpeedX und SpeedY.
verwende für sowas dann lieber Floats bzw. rechne mit tausendstel pixel.
jetzt kannst du in jedem Frame zu den aktuellen Sprite-Koordinaten deine SpeedX und SpeedY dazuaddieren und dann das Sprite wieder darstellen.
ich kann dir später mal ein billiges Beispiel hacken, jetzt muss ich erstmal Fisch braten....
du nimmst die Differenz zu den Zielkoordinaten, und teilst das durch die Anzahl Frames die du brauchen willst.
diese quotienten speicherst du in zwei variablen, zum beispiel SpeedX und SpeedY.
verwende für sowas dann lieber Floats bzw. rechne mit tausendstel pixel.
jetzt kannst du in jedem Frame zu den aktuellen Sprite-Koordinaten deine SpeedX und SpeedY dazuaddieren und dann das Sprite wieder darstellen.
ich kann dir später mal ein billiges Beispiel hacken, jetzt muss ich erstmal Fisch braten....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Mit dem Macro kannst du die den Weg zwischen 2 Punkten ausrechnen, vlt. kannst du das ja brauchen:
Code: Alles auswählen
Macro Way(x1, y1, x2, y2)
Sqr((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))
EndMacro
Debug Way(3, 4, 6, 7)Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Danke erstmal!
nein, das sprite muss keinen hindernissen ausweichen.
und gibt es einen weg daraus auch einen winkel zu ziehen, um ein sprite3d in flugrichtung zu drehen?
nein, das sprite muss keinen hindernissen ausweichen.
und gibt es einen weg daraus auch einen winkel zu ziehen, um ein sprite3d in flugrichtung zu drehen?
Zuletzt geändert von Elayn am 28.03.2009 14:26, insgesamt 1-mal geändert.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
- KeyKon
- Beiträge: 1412
- Registriert: 10.09.2004 20:51
- Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit) - Wohnort: Ansbach
- Kontaktdaten:
Ich bezweifle stark das der Normale ATan() immer den richtigen Winkel zurückgibt, du musst auch noch den Sektor berücksichtigen...
EDIT:
müsste so gehen:
EDIT:
müsste so gehen:
Code: Alles auswählen
Procedure.d ATan2(y.d,x.d)
If x < 0
ProcedureReturn ATan(y/x)+#PI
ElseIf x > 0 And y >= 0
ProcedureReturn ATan(y/x)
ElseIf x > 0 And y < 0
ProcedureReturn ATan(y/x)+2*#PI
ElseIf x = 0 And y > 0
ProcedureReturn #PI/2
ElseIf x = 0 And y < 0
ProcedureReturn 3*#PI/2
Else ; x = 0 and y = 0
ProcedureReturn 0
EndIf
EndProcedure
winkel1 = ATan2(y2-y1,x2-x1)(\/) (°,,,°) (\/)
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Und der Preis für die Ungenaueste Fehlermeldung der Woche geht an Elayn!
lass mich mal raten... du hast einfach den dort berechneten Winkel an RotateSprite3D übergeben...
nun... diese Proc arbeitet mit Winkelfunktionen, die bemessen einen Winkel im Bogenmaß.
RotateSprite3D hingegen erwartet einen Winkel der in Grad bemessen ist, also muss man wohl umrechnen.
und auch wenn ich jetzt richtig geraten habe - mach dir nächstes mal gefälligst die Mühe, halbwegs ausführlich zu beschreiben WAS nicht funktioniert und WIE.
lass mich mal raten... du hast einfach den dort berechneten Winkel an RotateSprite3D übergeben...
nun... diese Proc arbeitet mit Winkelfunktionen, die bemessen einen Winkel im Bogenmaß.
RotateSprite3D hingegen erwartet einen Winkel der in Grad bemessen ist, also muss man wohl umrechnen.
und auch wenn ich jetzt richtig geraten habe - mach dir nächstes mal gefälligst die Mühe, halbwegs ausführlich zu beschreiben WAS nicht funktioniert und WIE.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.