Atan2 stimmt bei Draw3D nicht mehr?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Atan2 stimmt bei Draw3D nicht mehr?

BeitragMi, Sep 23, 2009 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ihr.

Ich hab mal wieder den Kopf frei zum Programmieren und das trotz SChule.

Hab mich jetzt mal an Draw3D rangesetzt und ich muss sagen, man lernt verdammt schnell damit umzugehen.

Aber ich habe jetzt ein kleines Problem.
Undzwar möchte ich eine "Gta" Steuerung benutzen (endlich in Echtzeit^^) aber ich bekomm das mit den Winkeln nicht so richtig hin.

Ohne Draw3D hats ja geklappt, aber jetzt... Naja...
Das Problem ist folgendes: Das Schiff dreht sich wunderbar wenn man ben Mauszeiger bewegt.
Aber um 180° versetzt, wenn man das so sagen kann.
Also die Maus ist eigentlich immer HINTER dem Schiff.

Ich weiß nicht wo das Problem lieg, da es vorher ja funktioniert hat.
Deshalb bringen ältere Beiträge mir momentan recht wenig.
Wenn ich nen Denkfehler drinnen haben sollte, tut es mir leid.

Hier mal der Code für die Berechnung:

Code: [AUSKLAPPEN]
Spieler\PWinkel#=(ATan2(MouseY3D-Spieler\Py#,MouseX3D-Spieler\Px#) + 360) Mod 360 ;Blickrichtung


Und der ganze Code, wenn den jemand braucht:

Code: [AUSKLAPPEN]
AppTitle "Draw3D V.3.2 - LoadFont3D"
Graphics3D 1024,768,0,1
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
CameraClsColor Camera,5,5,5

Include "Includes\Draw3D.bb"
DrawInit3D(Camera)
Origin3D(1024,768)


;_______________________________________________
Global PlayerImage=LoadImage3D("gfx\spaceship2.bmp", 4, 2, 0)
Global MouseImage = loadimage3d("gfx\target.png", 2, 2, 0)

Type TPlayer
 Field Px#, Py#, PWinkel, PEnergie, PAltx#, PAlty#, PGeschw#, Image
End Type

Global Spieler.TPlayer = New TPlayer
 Spieler\Px# = (0)
 Spieler\Py# = (0)
 Spieler\PWinkel = 0
 Spieler\Image = PlayerImage
 Spieler\PEnergie = 100
 Spieler\PGeschw# = 3
;_________________________________________________



Repeat

   SpielerSteuerung()
   DrawImage3D(PlayerImage,Spieler\Px#,Spieler\Py#,0,Spieler\PWinkel#,1)
   Drawimage3d(MouseImage, MouseX3D, MouseY3D, 0, 0, 1)

   ;Zeichen()
   
   WaitTimer(Timer)
   RenderWorld
   Clear3D()
   Flip 0
Until KeyHit(1)
End



;___________________________________________________
Function SpielerSteuerung()

 Spieler\PAltx# = Spieler\Px#
 Spieler\PAlty# = Spieler\Py#

 Spieler\PWinkel#=(ATan2(MouseY3D-Spieler\Py#,MouseX3D-Spieler\Px#) + 360) Mod 360 ;Blickrichtung

 If Spieler\PWinkel > 359 Then Spieler\PWinkel = 0
 If Spieler\PWinkel < 0 Then Spieler\PWinkel = 359

 If KeyDown(17) Then ;Geradeaus
   Spieler\Px# = Spieler\Px#+Cos(Spieler\PWinkel)*Spieler\PGeschw#
   Spieler\Py# = Spieler\Py#+Sin(Spieler\PWinkel)*Spieler\PGeschw#
 EndIf

 If KeyDown(30) Then ;Links
   Spieler\Px# = Spieler\Px#-Cos(Spieler\PWinkel+90)*Spieler\PGeschw#
   Spieler\Py# = Spieler\Py#-Sin(Spieler\PWinkel+90)*Spieler\PGeschw#
 EndIf

 If KeyDown(32) Then ;Rechts
   Spieler\Px# = Spieler\Px#+Cos(Spieler\PWinkel+90)*Spieler\PGeschw#
   Spieler\Py# = Spieler\Py#+Sin(Spieler\PWinkel+90)*Spieler\PGeschw#
 EndIf

 If KeyDown(31) Then ;Nach hinten
   Spieler\Px# = Spieler\Px#-Cos(Spieler\PWinkel)*Spieler\PGeschw#
   Spieler\Py# = Spieler\Py#-Sin(Spieler\PWinkel)*Spieler\PGeschw#
 EndIf

 If Spieler\Px# > (GraphicsWidth()-20) Then Spieler\Px# = Spieler\PAltx#
 If Spieler\Py# > (GraphicsHeight()-20) Then Spieler\Py# = Spieler\PAlty#
 If Spieler\Px# < 20 Then Spieler\Px# = Spieler\PAltx#
 If Spieler\Py# < 20 Then Spieler\Py# = Spieler\PAlty#

End Function
;--------------------------------





Ich hoffe, dass mir jemand helfen kann.

Danke schonmal.

Lg, M0rgenstern

Xeres

Moderator

BeitragMi, Sep 23, 2009 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Spieler- und Mauskoordinate vertauschen?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

M0rgenstern

BeitragMi, Sep 23, 2009 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du damit meinst, dass ich statt:

Code: [AUSKLAPPEN]
Spieler\PWinkel#=(ATan2(MouseY3D-Spieler\Py#,MouseX3D-Spieler\Px#) + 360) Mod 360 ;Blickrichtung


Das hier schreiben soll:

Code: [AUSKLAPPEN]
Spieler\PWinkel#=(ATan2(Spieler\Py#-MouseY3D,Spieler\Px#-MouseX3D) + 360) Mod 360 ;Blickrichtung



Das funktioniert nicht.

Oder hab ich dich falsch verstanden mit dem vertauschen?

Lg, M0rgenstern.

Xeres

Moderator

BeitragMi, Sep 23, 2009 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wäre zumindest Logisch den Winkel von der Maus zum Spieler zu verwenden.
Da Draw3D Nullpunkt in der Mitte hat, musst du die Koordinaten auf 2D umrechnen:
X = MouseX3D - GraphicsWidth()/2
Y = (MouseY3D - GraphicsHeight()/2)*-1

Edit:
Alle Angaben ohne Gewähr... ich glaub das macht auch nicht unbedingt Sinn Confused
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Sep 23, 2009 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil die Draw3D keine gespiegelte Y-Achse hat (wie es sonst unter 2D ist), werden die Parameter bei Atan2 auch ''richtig'' angewendet, und zwar zuerst die X-Achse dann die Y-Achse.

Code: [AUSKLAPPEN]
ATan2(Spieler\Px-MouseX3D,Spieler\Py-MouseY3D)

Außerdem kann man komplett auf die Sicherheitsabfrage mit den Winkeln verzichten. Man braucht weder Mod noch weitere If-Abfragen zur Eingrenzung des berechneten Winkels.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

M0rgenstern

BeitragDo, Sep 24, 2009 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey danke.
Jetzt funktionierts mit der Maus (Bild muss scheinbar auch nach unten zeigen).

Aber ich hab ein neues Problem.
Ich komme mit dem Bewegen bei Draw3D nicht so ganz klar, wenn ich ehrlich bin.

Code: [AUSKLAPPEN]
Function SpielerSteuerung()

 Spieler\PAltx# = Spieler\Px#
 Spieler\PAlty# = Spieler\Py#

 Spieler\PWinkel#=ATan2(Spieler\Px#-MouseX3D,Spieler\Py#-MouseY3D) ;Blickrichtung



 If KeyDown(17) Then ;Geradeaus
   Spieler\Px# = Spieler\Px#+Cos(Spieler\PWinkel)*Spieler\PGeschw#
   Spieler\Py# = Spieler\Py#+Sin(Spieler\PWinkel)*Spieler\PGeschw#
 EndIf

 If KeyDown(30) Then ;Links
   Spieler\Px# = Spieler\Px#-Cos(Spieler\PWinkel+90)*Spieler\PGeschw#
   Spieler\Py# = Spieler\Py#-Sin(Spieler\PWinkel+90)*Spieler\PGeschw#
 EndIf

 If KeyDown(32) Then ;Rechts
   Spieler\Px# = Spieler\Px#+Cos(Spieler\PWinkel+90)*Spieler\PGeschw#
   Spieler\Py# = Spieler\Py#+Sin(Spieler\PWinkel+90)*Spieler\PGeschw#
 EndIf

 If KeyDown(31) Then ;Nach hinten
   Spieler\Px# = Spieler\Px#-Cos(Spieler\PWinkel)*Spieler\PGeschw#
   Spieler\Py# = Spieler\Py#-Sin(Spieler\PWinkel)*Spieler\PGeschw#
 EndIf

 

End Function


Mit diesem Code wird der Spieler jetzt bewegt, aber er bewegt sich sehr unterschiedlich.
Einmal bewegt er sich wenn ich "W" drücke auf die Maus zu, wenn er dann aber zu nah zur Maus kommt dann bewegt eer sich von ihr weg.

Könnt ihr mir das bitte erklären?

Lg, M0rgenstern

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Sep 24, 2009 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Es waren Sin/Cos vertauscht. So geht es:

Code: [AUSKLAPPEN]
Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
CameraClsColor Camera,64,64,64

Include "..\Includes\Draw3D2.bb"
DrawInit3D(Camera)

Local LoadedImage=LoadImage3D("..\Data\Draw3D2.png",2,2,0,-1)
Local GrabedImage=GrabImage3D(LoadedImage,64,192,384,128)

Local XS=500,Depth=12

Local PAltx#,Px#
Local PAlty#,Py#
Local PWinkel#
Local PGeschw#=4




While Not KeyHit(1)
   
;   PAltx#=Px#
;   PAlty#=Py#
   
   ;Blickrichtung
   PWinkel#=ATan2(MouseX3D-Px#,MouseY3D-Py#)
   
   ;Geradeaus
   If KeyDown(17) Then
      Px#=Px#+Sin(PWinkel)*PGeschw#
      Py#=Py#+Cos(PWinkel)*PGeschw#
   EndIf
   
   ;Links
   If KeyDown(30) Then
      Px#=Px#-Sin(PWinkel+90)*PGeschw#
      Py#=Py#-Cos(PWinkel+90)*PGeschw#
   EndIf
   
   ;Rechts
   If KeyDown(32) Then
      Px#=Px#+Sin(PWinkel+90)*PGeschw#
      Py#=Py#+Cos(PWinkel+90)*PGeschw#
   EndIf
   
   ;Nach hinten
   If KeyDown(31) Then
      Px#=Px#-Sin(PWinkel)*PGeschw#
      Py#=Py#-Cos(PWinkel)*PGeschw#
   EndIf
   
   DrawImage3D(GrabedImage,Px,Py,0,PWinkel,0.2)
   
   WaitTimer Timer
   RenderWorld
   Clear3D()
   Flip 0
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

M0rgenstern

BeitragDo, Sep 24, 2009 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey...
Danke... Jetzt stimmts.

Aber in deinem Code war ein Fehler^^

Hab ich schnell ausgebessert.

Für nach vorne zu gehen hast du

Code: [AUSKLAPPEN]
If KeyDown(17) Then
      Spieler\Px#=Spieler\Px#+Sin(Spieler\PWinkel)*Spieler\PGeschw#
      Spieler\Py#=Spieler\Py#+Cos(Spieler\PWinkel)*Spieler\PGeschw#
   EndIf


geschrieben.

Es muss aber heißen:

Code: [AUSKLAPPEN]
If KeyDown(17) Then
      Spieler\Px#=Spieler\Px#-Sin(Spieler\PWinkel)*Spieler\PGeschw#
      Spieler\Py#=Spieler\Py#-Cos(Spieler\PWinkel)*Spieler\PGeschw#
   EndIf


Und für Rückwärts entsprechend.

Aber vielen Dank^^

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group