Automatische Bewegung von 2D Spielfiguren
also hier ist ja der Bot ein Kreis mit n Linie ^^
cos und sin brauche ich um die Bewegung in x und y Richtung zu errechnen, da ich ja nicht mit Vektoren rechne, (also der Bot bewegt sich 2 nach x und 1 nach y), sondern mit Winkel und Geschw.
Deswegen muss ich das bei der bewegung erst umrechnen.
Dafür ist das drehen des Bots leichter:
Mit Hilfevon ATan kann ich berechnen in welche Richtung der Bot laufen MÜSSTE um zum Ziel zu kommen, z.B. in Richtung 45° wäre nach unten rechts.
Wenn der Bot nun nach 135° guckt, bzw. läuft, dann muss er sich halt drehen. das passiert bei diesen "Unterschied"-Zeug.
Erst errechne ich ob er sich linksrum oder rechtsrum drehen muss, und dann veränder ich die Drehgeschwindigkeit (Bot_dw) die ja dann immer zum Winkel des Bots addiert wird (Bot_w = Bot_w + Bot_dw).
Guckt der Bot nun ich die völlig andere Richtung ^^ dann ist Bot_dw sehr groß (3 oder -3) wenn er schon fast richting guckt sehr klein (0,5 oder -0,5)
cos und sin brauche ich um die Bewegung in x und y Richtung zu errechnen, da ich ja nicht mit Vektoren rechne, (also der Bot bewegt sich 2 nach x und 1 nach y), sondern mit Winkel und Geschw.
Deswegen muss ich das bei der bewegung erst umrechnen.
Dafür ist das drehen des Bots leichter:
Mit Hilfevon ATan kann ich berechnen in welche Richtung der Bot laufen MÜSSTE um zum Ziel zu kommen, z.B. in Richtung 45° wäre nach unten rechts.
Wenn der Bot nun nach 135° guckt, bzw. läuft, dann muss er sich halt drehen. das passiert bei diesen "Unterschied"-Zeug.
Erst errechne ich ob er sich linksrum oder rechtsrum drehen muss, und dann veränder ich die Drehgeschwindigkeit (Bot_dw) die ja dann immer zum Winkel des Bots addiert wird (Bot_w = Bot_w + Bot_dw).
Guckt der Bot nun ich die völlig andere Richtung ^^ dann ist Bot_dw sehr groß (3 oder -3) wenn er schon fast richting guckt sehr klein (0,5 oder -0,5)
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- lassma-asma
- Beiträge: 107
- Registriert: 10.07.2007 09:14
- Wohnort: Saarland
Ja, aber nur durch den Namen Winkelfunktionen muss man nicht unbedingt wissen was die genau machen ^^Kaeru Gaman hat geschrieben:lassma-asma hat geschrieben:wie machst du das mit winkeln und so ...
und wofür setzt du die sin() und cos() funktionen ein ...sinus und cosinus nennt man auch Winkelfunktionen...
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- lassma-asma
- Beiträge: 107
- Registriert: 10.07.2007 09:14
- Wohnort: Saarland
- lassma-asma
- Beiträge: 107
- Registriert: 10.07.2007 09:14
- Wohnort: Saarland
Moin Leute ,
ich hab mich ma nochma mit dem trigonometriezeugs hier auseinandergesetzt unn so was kleines getippt ...
So jetzt hab ich aber das Problem , dass der Schuss nicht immer trifft ! , Manchmal sitzt er genau unn manchmal is er gut 20 Pixel daneben ...
WARUM NUR ??????
HILFE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hoffe mir hilft jemand und danke schon mal im Voraus ...
(is noch PB 3 )
Gruß lassma-asma
ich hab mich ma nochma mit dem trigonometriezeugs hier auseinandergesetzt unn so was kleines getippt ...
Code: Alles auswählen
InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(1280,1024,32,"SCREEN")
Enumeration
#kreis
#ziel
EndEnumeration
#deg2rad = 3.14159265/180
Global kx.f,ky.f,zx.f,zy.f,mx.f,my.f,dx.f,dy.f,w.f,punkt2y.f,punkt2x.f,shotdel.l,posdel.l
kx = 600
ky = 500
zx = 900
zy = 150
shotdel = 50
posdel = 20
Structure shot
x.f
y.f
vx.f
vy.f
EndStructure
NewList shot.shot()
Procedure addshot(x,y,vx,vy)
AddElement(shot())
shot()\x = x
shot()\y=y
shot()\vx=vx
shot()\vy=vy
EndProcedure
CreateSprite(#kreis,50,50)
StartDrawing(SpriteOutput(#kreis)) : DrawingMode(4)
Circle(25,25,25,RGB(255,255,255))
StopDrawing()
CreateSprite(#ziel,10,10)
StartDrawing(SpriteOutput(#ziel))
Circle(5,5,5,RGB(255,0,0))
StopDrawing()
Repeat
ClearScreen(0,0,0)
ExamineKeyboard()
ExamineMouse()
mx = MouseX()
my = MouseY()
shotdel - 1
posdel - 1
dx = (zx+5)-(kx+25)
dy = (zy+5)-(ky+25)
Gosub shot
w = ATan(dy/dx)/#deg2rad
If dx < 0
w +180
EndIf
If w < 0
w + 360
EndIf
If w > 360
w - 360 : EndIf
punkt2y.f = 25 +Sin(w*#deg2rad) * 25
punkt2x.f = 25 +Cos(w*#deg2rad) * 25
StartDrawing(SpriteOutput(#kreis))
Box(0,0,50,50,RGB(0,0,0)):DrawingMode(4)
Circle(25,25,25,RGB(255,255,255))
LineXY(25,25,punkt2x,punkt2y,RGB(0,255,0))
StopDrawing()
DisplayTransparentSprite(#kreis,kx,ky)
DisplayTransparentSprite(#ziel,zx,zy)
If shotdel < 0
addshot(kx+25,ky+25,Cos(w*#deg2rad)*10,Sin(w*#deg2rad)*10)
shotdel = 50
EndIf
FlipBuffers()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
If KeyboardPushed(#PB_Key_Space) And posdel < 0
zx = Random(1200)
zy = Random(1000)
posdel = 20
EndIf
ForEver
shot:
ForEach shot()
shot()\x + shot()\vx
shot()\y + shot()\vy
StartDrawing(ScreenOutput())
Circle(shot()\x,shot()\y,2,RGB(255,165,0))
StopDrawing()
If shot()\x > 1280 Or shot()\x < 0 Or shot()\y > 1024 Or shot()\y < 0
DeleteElement(shot())
EndIf
Next
Return
WARUM NUR ??????

HILFE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hoffe mir hilft jemand und danke schon mal im Voraus ...
(is noch PB 3 )
Gruß lassma-asma
Gruß lassma-asma
MultiPONG
HANGMAN
PB 3.94 und PureBasic 4.51 !!!
MultiPONG
HANGMAN
PB 3.94 und PureBasic 4.51 !!!
ganz einfach :
änder das zu
Hintergrund:
Deine Structure shot ist zwar richtigerweise .f und du gibst auch Floats an die Procedure addshot(), aber dort wird aus ihnen LONGs und dieese werden dann dem Element zu geteilt, änder dies wie oben beschrieben und es funzt.
Code: Alles auswählen
Procedure addshot(x,y,vx,vy)
Code: Alles auswählen
Procedure addshot(x.f,y.f,vx.f,vy.f)
Deine Structure shot ist zwar richtigerweise .f und du gibst auch Floats an die Procedure addshot(), aber dort wird aus ihnen LONGs und dieese werden dann dem Element zu geteilt, änder dies wie oben beschrieben und es funzt.
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- lassma-asma
- Beiträge: 107
- Registriert: 10.07.2007 09:14
- Wohnort: Saarland