Frage zu Winkelfunktionen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Pdd

Betreff: Frage zu Winkelfunktionen

BeitragSa, Jan 13, 2007 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Da ich leider erst in der 9. Klasse bin, hatten wir in der Schule bisher noch keine Winkelfunktionen wie cos, sin und atan2. Aber ohne die, werden alle Spiele letztendlich etwas "eckig" Wink

Daher hier mal eine Frage, wie man das lösen könnte.
Ich habe einen Turm (TTurm), welcher Geschosse (TSchuss) Abschiesen kann. Ausserdem gibt es einen Gegner (TGegner). Nun soll, wenn der Gegner innerhalb eines bestimmten Radiuses um den Turm ist, vom Turm atakkiert werden. D.h. ich muss einen "kreis" um den Turm legen und sehen, ob der Gegner sich darin befindet. Wie man das mit einem Rechteck machen könnte, weis ich aber nicht wie das mit einem Kreis gehen könnte.
Dazu kommt, das der Schuss ja auch schräg fliegen soll. Wenn also der Gegner bei X=10 und Y = 10 ist, der Turm aber bei X=50 und Y=90, dann soll dieser Schuss da schräg hochfliegen. Wie kann man das lösen, also mit diesen Winkelfunktionen.

mfg Pdd
Lieber Apfel als Birne.

kreisman

BeitragSa, Jan 13, 2007 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Dafür brauchts du kein SIn Cos. Dir reicht der Satz des Pythagoras, jedenfalls um zu überprüfen ob der gegner im radius des Turms ist.Es gilt:

r² = (x-xm)²-(y-ym)²
<=> r = Sqr((x-xm)²-(y-ym)²)

Wobei P(xm|ym) der Mittelpunkt des Kreises ist.Bei deinem Beispiel die Koordinaten des Turms und x,y sind die Koordinaten des Gegners.Wenn nun also der Radius r <= dem Angriffsradius des Turms ist kann dieser den Gegner angreifen.Ich hoffe das konnte helfen.

SpionAtom

BeitragSa, Jan 13, 2007 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal wieder packte mich die Langeweile:

Ob der Gegner (die Maus) im Kreis ist, überprüfe ich mit der bereits genannten Abstandsformel. Die Schüsse allerdings bewege ich mit Sin und Cos (siehe Schuss bewegen)

Code: [AUSKLAPPEN]
Const xr = 800, yr = 600: Graphics xr, yr, 0, 2: SetBuffer BackBuffer()

   Type Schuss
      Field x#, y#, xm#, ym#, w#, r#
   End Type
   
   TurmX = xr/2:   TurmY = yr/2:   TurmRadius = 150

   Repeat
      mx = MouseX(): my = MouseY()

         ;Turm verschieben bei Rechtsklick
         If MouseDown(2) Then    TurmX = mx: TurmY = my
         
         ;Schuss erstellen bei Linksklick oder bei Eintritt in den Kreis
         If MouseHit(1) Or (TurmX-mx)^2 + (TurmY-my)^2 < TurmRadius^2 Then
            Schuss.Schuss = New Schuss
            Schuss\xm = TurmX: Schuss\ym = TurmY
            px = mx: py = my
            Schuss\w# = (360+ATan2(Schuss\xm-px, Schuss\ym-py)) Mod 360
            Schuss\r# = 1
         End If         
         
         ;Schuss bewegen
         For Schuss.Schuss = Each Schuss
            Schuss\x = Schuss\xm - Sin(Schuss\w) * Schuss\r
            Schuss\y = Schuss\ym - Cos(Schuss\w) * Schuss\r
            Schuss\r = Schuss\r + 5
            If Schuss\x < 0 Or Schuss\x > xr Or Schuss\y < 0 Or Schuss\y > yr Then Delete Schuss.Schuss
         Next

         ;Erkläre
         Cls: Color 255, 255, 255
         Text 0, 0,  "Turm setzen - Rechtsklick"
         Text 0, 16, "schießen    - Linksklick (oder Maus in den Kreis bewegen)"

         ;Turm malen
         Color 100, 100, 100:   Oval TurmX - 10, TurmY - 10, 20, 20, 1
         Color 50, 50, 50:   Oval TurmX - 8, TurmY - 8, 16, 16, 1
         Oval TurmX - TurmRadius, TurmY - TurmRadius, 2 * TurmRadius, 2 * TurmRadius, 0
         
         ;Schuss malen
         Color 255, 0, 0
         For Schuss.Schuss = Each Schuss
            Oval Schuss\x-2, Schuss\y-2, 4, 4
         Next         
      
      Flip()
   Until KeyDown(1)
   End
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Jan 13, 2007 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgend wo im Forum steht das schon, aber da ich das auf meiner HDD schneller finde......
Hier wird der Panzer immer in die richtige richtung gedreht
Code: [AUSKLAPPEN]
Graphics 800 ,600,16,2
SetBuffer BackBuffer ()
Dim Panzer (360)
;PanzerGrafik_berechnen > 360 Einzelbilder <
Rect 9 ,0,2,20
Rect 0 ,10,20,20,1
Flip
Panzer (0) = CreateImage (20 ,30)
GrabImage Panzer (0) ,0,0
MidHandle Panzer (0)

For z = 1 To 359
    panzer (z) = CopyImage (Panzer (0) )
    RotateImage panzer (z) ,z
    Text 500 ,500," Berechne Panzer : " + z
    If z Mod 10 = 0 Then Flip
    Cls
Next

Repeat
   
    x = MouseX ()
    Y = MouseY ()   ;Winkel bezieht sich auf den Panzer
   Distanz = Sqr((400-x)^2 + (300-y)^2)
   Oval 400-200,300-200,400,400,0 ;Anzeige Distanz
   If Distanz < 200 Then
        winkel = Objekt_richtung_grad (x,y ,400 ,300)
      Richtung = drehAufZiel (pospanzer,winkel)
      If Richtung <> 0 Then
         posPanzer = (posPanzer + Richtung  + 360) Mod 360
         Else
           ;CreatePanzerSchuss(400,300)
      End If
   End If
    Oval x - 5 ,y - 5 ,10,10,1 ;Klickpunkt malen
    DrawBlock Panzer (posPanzer) ,400,300;Panzer malen
    Text 100 ,30, posPanzer + " Panzer"
    Text 100 ,60, winkel +   " Grad"
    Flip
    Cls
Until KeyHit (1)

End

Function Objekt_richtung_grad (Zielpunkt_X,Zielpunkt_Y,Ausgangspunkt_X,Ausgangspunkt_Y )
    grad = ATan2 (Zielpunkt_Y - Ausgangspunkt_Y, Zielpunkt_X - Ausgangspunkt_X) + 90
    grad = (grad + 360) Mod 360
    Return grad
End Function

Function drehAufZiel (pospanzer,winkel)
If pospanzer= winkel Then Return
    If posPanzer > Winkel Then
        If posPanzer - 180 < Winkel Then Return - 1
     Else
        If posPanzer + 180 < Winkel Then Return - 1
    End If
    Return 1
End Function

Das Schießen ist auch einfach und damit die Geschosse auch schräg fliegen ,bei jedem durchlauf der schleife...
Code: [AUSKLAPPEN]
 SchussX# = SchussX# + Cos(grad)*Speed
SchussY# = SchussY# + Sin(grad)*Speed
..neu gesetzt
[BB2D | BB3D | BB+]

Pdd

BeitragSa, Jan 13, 2007 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, vielen Dank an euch 3, es funktioniert wunderbar Smile
Lieber Apfel als Birne.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group