Problem mit Atan2 (Autodrehung durch Maus)

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Die Kiste

Betreff: Problem mit Atan2 (Autodrehung durch Maus)

BeitragFr, Jan 08, 2010 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich bin neu hier im Forum und dies ist mein 1. Post
Ich wollte mal grade eben zwischendurch ein Auto Programmieren das sich per Pfeiltaste(Oben)
und Maus Steuern lässt ,nun das hab ich soweit geschaft doch wenn ich die Maus schnell Hinter´s Auto Ziehe bekomme ich entweder die Fehlermeldung "Array out of Bounds" oder "Image does not Exist" .
Hab mich schon im Forum umgesehen ,aber je mehr ich davon lese desto wengier versteh ich. Shocked
Code: [AUSKLAPPEN]
Graphics 800,600,32,1

SetBuffer BackBuffer()


Dim Auto(360)

TFormFilter 0

For winkel = 0 To 359

      Auto(winkel)=LoadImage("Lupo.png")

      RotateImage auto(winkel),winkel

     MidHandle Auto(Winkel)

      MaskImage Auto(winkel),255,0,255

Next

Global Maus=LoadImage ("Maus.png") 

Global geschwindigkeit#=1

Global x#=400,y#=300


Repeat
 
Maus()

winkel=(ATan2( MouseY() - Y, MouseX() -X )+ 360) Mod 360



If KeyDown  (200)
   x = x + Cos(winkel)*geschwindigkeit

   y = y + Sin(winkel)*geschwindigkeit
End If
DrawImage auto(winkel),x,y

Flip   
Cls
Until KeyHit (1)

End

Function Maus()

mx=MouseX()

my=MouseY()

MaskImage Maus ,255,0,255

DrawImage Maus,mx,my

End Function


Würde mich über euere Hilfe freuen
Lg "Die Kiste"

~EDITIERT~

Das mit der Ganzbeitragsformatierung lass ich ja mal sowas von nicht durchgehen, unterlasse das in Zukunft!
Mfg und herzlich willkommen an Board
Holzchopf

Midimaster

BeitragFr, Jan 08, 2010 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Um nur dein Problem anzusprechen

Ich würde nach der Winkelberechnung ein...

BlitzBasic: [AUSKLAPPEN]
Winkel = Int( ( Winkel +360 ) Mod 360)


... setzen, um auszuschließen, dass er negative Winkel oder Werte über 360° geben könnte


[EDIT]

ich bin scheinbar total verblödet jetzt: Das hast du ja längst!!! Sorry

blackgecko

BeitragFr, Jan 08, 2010 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab jetzt mal ein bisschen an deinem Code rumgepfuscht und so gehts anscheinend:
Code: [AUSKLAPPEN]
For winkel = 0 To 360

(Das ist die Stelle, an der das Bild gedreht wird)
Musst aber mal ein bisschen rumprobieren, obs wirklich geht. Ich kann dir auch nicht auf Anhieb sagen, an was es hing.

In den Code solltest du noch einen Timer einbauen, so wie es jetzt ist, hat das Spiel 100% CPU-Auslastung.
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax
Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die.

Die Kiste

BeitragFr, Jan 08, 2010 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch eine kleine Frage ,sollte ich bei so kleinen Auschnitten des Codes (Z.b winkel=(ATan2( MouseY() - Y, MouseX() -X )+ 360) Mod 360 )auch als Code formatiert sein?

Ach und ,ihr seid ja richtig fix hier im Forum, woanders müsste man länger warten...

Midimaster

BeitragFr, Jan 08, 2010 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
winkel#=(ATan2( -0.1, 100 )+ 360) Mod 360
Print winkel


dieser Wert bringt einen Winkel von 359.942719

und damit brauchst du das 360. Bild oder den INTEGER()

Tennisball

BeitragFr, Jan 08, 2010 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
dieser Wert bringt einen Winkel von 359.942719


Floor
Damit machst du 359.942719 zu 359

Du könntest es natürlich auch so machen:
BlitzBasic: [AUSKLAPPEN]
winkel = Int(ATan2(...))
If winkel = 360 Then winkel = 0

Die Kiste

BeitragFr, Jan 08, 2010 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Dankeschön Very Happy
Eigentlich dachte ich ,dass das so hätte sein sollen... (Da ich sowas schonmal gemacht habe,aber es in Totalen Spaghetti-Code geendet ist, der irgendwo auf meinem andren Pc rumgeistert)
Und dazu ich das so mehrmals gesehen habe ,aber anscheinend hab ich mich geirrt und die Winkel in den andren Beispielen(Inklusive mein Spaghetti-Code Laughing ) waren alles Ganzzahlen.

Naja es Funktioniert,vielen Dank

[EDIT]
Der Timer kommt noch, ist schließlich erst der Anfang und ein Werk von 5 min (5 min die es brauchten mich zum verzweifeln zu Bringen )
  • Zuletzt bearbeitet von Die Kiste am Fr, Jan 08, 2010 21:05, insgesamt einmal bearbeitet

TimBo

BeitragFr, Jan 08, 2010 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
besser als Floor ist Mod

Mod gibt den Restwert zurück.

Winkel Mod 360

dann wird eine 360 zu einer 0, denn 360/360 = 1 Rest 0
und 361 wird zu einer 1, denn 361/360 = 1 Rest 1

Greez
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Die Kiste

BeitragFr, Jan 08, 2010 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
besser als Floor ist Mod

Question Ich dachte Mod Steht schon im Code...
Code: [AUSKLAPPEN]
winkel=(ATan2( MouseY() - Y, MouseX() -X )+ 360) Mod 360

Ganz am Schluss, oder muss Mod nochmal hin?

Nicdel

BeitragFr, Jan 08, 2010 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Das +360 muss raus.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

TimBo

BeitragFr, Jan 08, 2010 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
nehm alles zurück
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Holzchopf

Meisterpacker

BeitragFr, Jan 08, 2010 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Aiaiai, was hier in letzter Zeit jeder die Vorredner korrigieren muss, ist ja echt mal schlimm. Leute, was ihr da tut, ist ja sicher gut gemeint, aber denkt ihr nicht auch, dass ihr manchmal damit ein wenig zu viel des guten leistet?
Natürlich will jeder als hilfsbereiter Mensch dastehen, aber mir scheint, dieser Wille führt vermehrt dazu, gesagtes einfach noch mal zu sagen Wink
Und weil's so in ist, spring ich auch mal auf den Zug Very Happy

@Timbo: Du hast offenbar das Problem nicht ganz verstanden. Denn Atan2 ist keine Ganzzahlfunktion und liefert auch gerne mal 359.9 zurück - Mod 360 macht daraus dann 359.9, was dann wiederum als Ganzzahl in 360 umgewandelt wird.

@Tennisball: Floor ist überflüssig. Die Kiste (der Threadersteller, nicht der Computer) braucht ja schlussendlich auch nur n Int, wieso also noch eine zusätzliche floatingpoint-Operation? Midimaster hat's gesagt - und zwar auf eine für Anfänger gute weise: er hat nicht das fertige Resultat hingeworfen, sondern Hinweise gegeben - Int reicht (man muss halt nur zum richtigen Zeitpunkt casten *hust*)

@Nicdel: Das +360 muss da hin, weil Atan2 Werte von -180 bis +180 liefert, Mod aber nur mit positiven Zahlen korrekt arbeitet.

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Die Kiste

BeitragFr, Jan 08, 2010 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicdel hat Folgendes geschrieben:
Das +360 muss raus.


Wieso ich dachte das sollte man bei Atan2 machen da er werte von -90 bis 90 ausspuckt?
Abgesehen davon kommt wenn ich die +360 enferne, kommt gleich nach dem Start "Array index out of Bounds"

TimBo

BeitragFr, Jan 08, 2010 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
ok Embarassed
tut mir ja leid . Hab ich nicht mit Absicht gemacht.
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Nicdel

BeitragFr, Jan 08, 2010 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
@Nicdel: Das +360 muss da hin, weil Atan2 Werte von -180 bis +180 liefert, Mod aber nur mit positiven Zahlen korrekt arbeitet.

*hust*
Das kommt davon, wenn man zuviel mit BlitzMax arbeitet. Da macht das keine Probleme mehr...

Edit:
Denk ich immer noch falsch, oder ist +180 nicht besser geeignet als +360?
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Jan 08, 2010 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei +180 verfälscht du den Winkel. Bei +360 jedoch nicht da +10° und +370° die selbe Richtung ergeben, aber von Atan2 richtig gekürzt wird.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Die Kiste

BeitragFr, Jan 08, 2010 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
ups Embarassed
Okaaay ,Danke für euere Hilfe.
Hab ich richtig verstanden?
Code: [AUSKLAPPEN]
...
winkel=(ATan2( MouseY() - Y, MouseX() -X )+360) Mod 360
Winkel = Int Winkel
...

Wenn ja,dann weiß ich nicht warum auf einmal der Debuger (nach einiger Zeit) nurnoch "Image does not exist" ausspuckt ,das Bild wird doch geladen ,oder?
[Edit]

Was villeicht auch wichtig sein könnte, die Fehlermeldung wird nur aussgegeben wenn ich die Pfeiltaste oben Gedrück halte (Das Auto Praktisch fährt)

Tankbuster

BeitragFr, Jan 08, 2010 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Winkel kann noch größer als 360° sein, und <0°.

Das musst du noch checken ala

Zitat:
If Winkel<0 Then Winkel=359
Twitter
Download Jewel Snake!
Windows|Android

Goodjee

BeitragFr, Jan 08, 2010 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
oder halt

winkel=(winkel + 360) Mod 360
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Die Kiste

BeitragFr, Jan 08, 2010 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke,
Wenn ich die Int sache nach "Drawimage..." Setze Funktioniert es.
Ich glaub das hat Holzchopf mit Zitat:
(man muss halt nur zum richtigen Zeitpunkt casten *hust*)
gemeint. Nochmal vielen Dank ,mach mal jetzt aber schluss mit Coden nacher hock ich noch die ganze Nacht an nem andren Problem ... Very Happy

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group