Frage zu Winkelfunktionen
Übersicht

![]() |
PddBetreff: Frage zu Winkelfunktionen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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" ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
..neu gesetzt
SchussY# = SchussY# + Sin(grad)*Speed |
||
[BB2D | BB3D | BB+]
|
![]() |
Pdd |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, vielen Dank an euch 3, es funktioniert wunderbar ![]() |
||
Lieber Apfel als Birne. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group