Tan/ATan

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Tan/ATan

Beitrag von Kumpu »

Also, mein Problem ist dass ich mit dem Tan und dem ATan nicht zurechtkomme. Anscheinend bekomme ich den Tan als Bogenneinheit (so weit so gut), aber wie rechne ich einen Tan in Bogenneinheit wieder so um dass ich ihn in ATan einsetzen kann, wieder umrechne und den Winkel bekomme (den brauche ich nämlich). Ich wäre froh wenn ihr mir helfen könntet :).

Das ist ein Problem, ich will das Teil in ein (aufgemotztes) PingPong-Spiel einbauen, und durch Zufall erscheint eine Kanone und schießt den Ball zurück (dafür bräuchte ich den Winkel dann). Leider wird die Kanone nichtmal falschrum angezeigt...
Hiermal der Code- Es ist erst mein 2. Programm, also habt bitte Nachsicht :)

Code: Alles auswählen

MP = MessageRequester("WasDuWolle?", "2-Spieler", #PB_MessageRequester_YesNo)
MP = MP - 5
If MP = 1
 MessageRequester("Achtung:", "Steuerung Spieler 2: Keypad 8 & 2", 0)
EndIf
If InitSprite() = 0
 MessageRequester("!", "Fehler beim Sprite-Initialisieren^^", 0)
 End
EndIf
If OpenScreen(640, 480, 16, "Paddle") = 0
 MessageRequester("!", "Fehler beim Screen-Loaden^^", 0)
 End
EndIf
Speed = 5
CatchSprite(0, ?Paddle)
CatchSprite(1, ?Ball)
CatchSprite(2, ?Kanone,#PB_Sprite_Texture)
InitSprite3D()
CreateSprite3D(0,2)
Global Start, x_ball, y_ball, Waagerecht_Ball, Paddle_1 , Paddle_2, ShowPaddle1, ShowPaddle2, ShowGun, Winkel, Gun_x, Gun_Y, Quadrat
ShowPaddle2=1
ShowPaddle1=1
x_Ball = 30
y_Ball = 10
Waagerecht_Ball = 1
Senkrecht_Ball = 1
Paddle_1 = 200
Paddle_2 = 200
If InitSound() = 0
 MessageRequester("!!!", "Der Sound konnte nicht geladen werden! Was soll denn das???", 0)
 End
EndIf
CatchSound(0, ?Sound)
If InitKeyboard() = 0
 MessageRequester("!", "Fehler beim Keyboard-Initialisieren^^", 0)
 End
EndIf
Procedure Kanone(Bob)
Starta:
End=0
Repeat
Delay(50)
Until Start=1
If Waagerecht_Ball=1
 ShowPaddle2=0
 Gun_x=620
Else
 ShowPaddle1=0
 Gun_x=1
EndIf
Repeat
If Waagerecht_Ball=1
 If y_Ball>paddle_2
  quadrat=4
 Else
  quadrat=3
 EndIf
Else
 If y_Ball>paddle_1
  quadrat=2
 Else
  quadrat=1
 EndIf
EndIf
If Waagerecht_Ball=1
 Gun_y=Paddle_2
 GK=(Sqr(y_ball-paddle_2))²
 AK=(Sqr(x_ball-625))²   
Else
 Gun_y=Paddle_1
 GK=(Sqr(y_ball-paddle_1))²
 AK=(Sqr(x_ball-1))² 
EndIf
Winkel=ATan(GK/AK)
If Showgun=0
 ShowGun=1
EndIf
End=End+1
Delay(60)
Until End=200
Start=0
ShowGun=0
ShowPaddle1=1
ShowPaddle2=1
Waagerecht_Ball*-1=Waagerecht_Ball
Goto Starta
EndProcedure
CreateThread(@Kanone(), 0)
Repeat
Delay(60)
x_Ball = x_Ball + (Waagerecht_Ball * Speed)
y_Ball = y_Ball + Senkrecht_Ball
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Up) And Paddle_1 > 1
 Paddle_1 = Paddle_1 - 10
EndIf
If KeyboardPushed(#PB_Key_Down) And Paddle_1 < 430
 Paddle_1 = Paddle_1 + 10
EndIf
If y_Ball < 2 Or y_Ball > 449
 Senkrecht_Ball = Senkrecht_Ball - (2 * Senkrecht_Ball)
EndIf
ClearScreen(0,0,0)
If ShowPaddle1=1
 DisplaySprite(0, 1, Paddle_1)
EndIf
If ShowPaddle2=1
 DisplaySprite(0, 625, Paddle_2)
EndIf
DisplaySprite(1, x_Ball, y_Ball)
If ShowGun=1
 Start3D()
 RotateSprite3D(0, (360-quadrat*90+Winkel),0)
 DisplaySprite3D(0, Gun_x,Gun_y)
 Stop3D()
EndIf
FlipBuffers()
If MP = 2
 If Waagerecht_Ball = 1
  If Paddle_2+20 > y_Ball
   Paddle_2 = Paddle_2 - 3
  EndIf
  If Paddle_2+20 < y_Ball
   Paddle_2 = Paddle_2 + 3
  EndIf
 EndIf
EndIf
If Mp = 1
ExamineKeyboard()
 If KeyboardPushed(#PB_Key_Pad8) And Paddle_2 > 1
 Paddle_2 = Paddle_2 - 10
 EndIf
 If KeyboardPushed(#PB_Key_Pad2) And Paddle_2 < 430
 Paddle_2 = Paddle_2 + 10
 EndIf
EndIf
If x_Ball < 21 
 If Paddle_1 + 49 > y_Ball And Paddle_1 < y_Ball + 20
  Waagerecht_Ball = Waagerecht_Ball - (2 * Waagerecht_Ball)
  Speed = Speed + 1
  PlaySound(0)
  If MP = 2
   HS = HS + 100
  EndIf
 Else
  CloseScreen()
  If MP = 2
  MessageRequester("=(", "Verloren... "+Str(HS)+" Punkte", 0)
  Else 
  MessageRequester("={", "Spieler 2 gewinnt!!!!!", 0)
  EndIf
  End
 EndIf
EndIf
If x_Ball > 600 
 If Paddle_2 + 49 > y_Ball And Paddle_2 < y_Ball+20
  Waagerecht_Ball = Waagerecht_Ball - (2 * Waagerecht_Ball)
  Speed = Speed + 1
  PlaySound(0)
 Else
  CloseScreen()
  If Mp = 2
  MessageRequester(":)", "Gewonnen!!!... "+Str(HS)+" Punkte", 0)
  Else 
  MessageRequester(":{", "Spieler 1 gewinnt!!!!!", 0)
  EndIf
  End
 EndIf
EndIf
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
 CloseScreen()
 MessageRequester("Ciaobella^^", "Auf Wiedersehen geehrter Spieler!", 0)
 End
EndIf
If KeyboardPushed(#PB_key_Add)
 Speed = Speed +1
EndIf
If KeyboardPushed(#PB_Key_PadEnter)
 Senkrecht_Ball+1
EndIf
If KeyboardPushed(#PB_Key_C)
 MessageRequester("Hallöle", "C) David F^^ Cool wa?", 0)
EndIf
If Int(Random(300))>50 And Start=0
 If Waagerecht_Ball=1 And x_Ball<400 And Speed<15 Or Waagerecht_Ball=-1 And x_Ball>150 And Speed<15
 Start=1
 EndIf
EndIf
ForEver

Paddle:
 IncludeBinary "paddle.bmp"
Ball:
 IncludeBinary "ball.bmp"
Sound:
 IncludeBinary "chop.wav"
Kanone:
 IncludeBinary "gun.bmp"


Die Zufälligkeit hab ich extra so hoch, weil ich das ja testen will.

Code-Tags ergänzt - Andesdaf
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Allgemeiner Hinweis:
Benutze die Code-Tags [_code] und [_/code] (ohne _), um deinen Code einzufassen.
Eine sinnvolle Einrückung wäre auch nicht schlecht.
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Code: Alles auswählen

GK=(Sqr(y_ball-paddle_2))² 
:?: :|
da muss er dir doch nen fetten syntax error ausspucken!

ist mir außerdem unklar, was das bewirken soll...
wurzel zum quadrat? redundant, oder?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Tan arbeitet ja nich im vollen Winkelbereich, du brauchst das hier:
Arkus-Tangens bzw einfach ATan2()
(\/) (°,,,°) (\/)
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Beitrag von Kumpu »

Ich nehme erst die Wurzel und dann das Quadrat, nun fällt ein eventuelles negatives Vorzeichen weg. Was genau ist ATan2? Ich brauche jedenfalls eine Umkehrfunktion des Tangens die nicht im Bogenmass arbeitet... Also ich hab die AK und die GK -> ich hab den Tan. Nun brauche ich den Winkel um meine Kanone zu rotieren...
Aber trotzdem danke für die schnellen Antworten
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Kumpu hat geschrieben:Ich nehme erst die Wurzel und dann das Quadrat, nun fällt ein eventuelles negatives Vorzeichen weg.
Mathematiker versucht zu programmieren... :mrgreen:

also, mir ist neu, dass das ² -Zeichen eine Funktion hat.
normalerweise würde man sowas machen:

Code: Alles auswählen

Var = ( Term )
Ergebnis = Var * Var
die Vorgehensweise, einfach mal Sqr() zu benutzen, ist nicht umsonst ungewöhnlich:
das ist eine relativ langsame Funktion.

je nachdem was für einen Wertebereich du hast ( kleiner als +/- 2 hoch 22 )
kannst du die Funktion Abs() benutzen, um den Absoluten Wert zu ermitteln.
Wenn das nicht sicher ist, programmiert man sowas so:

Code: Alles auswählen

If Var < 0 : Var = -Var : EndIf
das ist x-mal schneller als die Wurzel zu quadrieren.


einen Winkel aus dem Bogenmaß bekommst du einfach mit dem umgekehrten Dreisatz,
wie du das Bogenmaß aus dem Winkel bekommst.
Winkel = Bogen * 180 / #pi
Bogen = Winkel * #pi / 180


> dass ich eine relativ alte Version von PB habe...

dann schreib das bitte in deine Signatur, ggf. auch im ersten Posting bei einer Frage noch mit dazu sagen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Little John

Beitrag von Little John »

Kumpu hat geschrieben:Ich nehme erst die Wurzel und dann das Quadrat, nun fällt ein eventuelles negatives Vorzeichen weg.
Das ist die umständlichste Methode für diesen Zweck von der ich je gehört habe, und noch dazu eine die nicht funktioniert. :mrgreen:
(Funktionieren würde zuerst das Quadrat zu berechnen, und dann daraus die Wurzel.)

Tipp: Abs()

Gruß, Little John
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Beitrag von Kumpu »

Natürlich funktioniert das! Ich programmiere schon lange für meinen Taschenrechner und die Formel hat mich noch nie im Stich gelassen^^
Natürlich kennt ihr euch da mehr aus als ich... Ich benutze PB auch erst seit einer Woche.
Also, abgesehn von den Winkelfunktionen, warum läuft das Ding nicht wie es soll? Ich bin echt ratlos... Ist es falsch den Winkel in einem Threat zu berechnen und dann in der Mainroutine anzeigen zu lassen? (sagt man dazu dann Thread?!?) oder wie läuft das...
Little John

Beitrag von Little John »

Kumpu hat geschrieben:Natürlich funktioniert das!
Aber nicht nach den gültigen mathematischen Regeln ...
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Beitrag von Kumpu »

Wieso nicht? Aaaah ok, ich meinte eher Sqr(xyz²)... Ich war etwas durcheinander... hast recht
Antworten