Atan2 stimmt bei Draw3D nicht mehr?
Übersicht

![]() |
M0rgensternBetreff: Atan2 stimmt bei Draw3D nicht mehr? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group