Automatische Bewegung von 2D Spielfiguren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

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)
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

lassma-asma hat geschrieben:wie machst du das mit winkeln und so ...
und wofür setzt du die sin() und cos() funktionen ein ...
:mrgreen: sinus und cosinus nennt man auch Winkelfunktionen...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag von lassma-asma »

ja gut ... lol ja hast recht ... :cry: :oops:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

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 ...
:mrgreen: sinus und cosinus nennt man auch Winkelfunktionen...
Ja, aber nur durch den Namen Winkelfunktionen muss man nicht unbedingt wissen was die genau machen ^^
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hab ich auch nicht behauptet.

aber die verbindung "wie machst du die winkel"<->"wozu nimmst du sin" war eben einfach komisch.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag von lassma-asma »

OKAY !!!!!!!!!!!!!!!!!
GENUG JETZT !!!!!!!!!!!!!!!!!! :evil: :evil: :( :( :freak: :freak:
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag von lassma-asma »

Moin Leute ,

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
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
Gruß lassma-asma

MultiPONG
HANGMAN


PB 3.94 und PureBasic 4.51 !!!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ganz einfach :

Code: Alles auswählen

Procedure addshot(x,y,vx,vy) 
änder das zu

Code: Alles auswählen

Procedure addshot(x.f,y.f,vx.f,vy.f) 
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.
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
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag von lassma-asma »

AAAAAAA DANKE STARGATE ,

wusste nich das man das dann nochmal angeben muss .. jo jetzt funzt es ...

Gruß
Gruß lassma-asma

MultiPONG
HANGMAN


PB 3.94 und PureBasic 4.51 !!!
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

[offtopic]Ist nur so ein Gefühl oder Eindruck; aber ich denke ma, lassma-asma wird auch mal eine der "großen Gestalten" hier im Forum <) [/offtopic]
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Antworten