Ein Geschoss im Flug rotieren lassen?

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

firstclimber

Betreff: Ein Geschoss im Flug rotieren lassen?

BeitragMo, Aug 22, 2011 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen Smile

Seid einigen Tagen beschäftige ich mich mit BlitzBasic und komme momentan nicht weiter Confused

Folgender Code:

Code: [AUSKLAPPEN]


Graphics 1024,768,16, 2

SetBuffer BackBuffer()

timer=CreateTimer (60)

Type foe
   Field x
   Field y
   Field dead
   Field speed
End Type

Type shot
   Field x
   Field y
   Field winkel
   Field dead
   Field drag#
End Type

Global counter_foes
Global player_Lastschuss

;background = LoadImage ("gfx\background.bmp")
;...............................................................Mainloop..................................................................................................

Repeat
   ClsColor 255,255,255
   Cls
   ;DrawImage background,0,0
   Color 0,255,0
   Rect 0, 494, 1024, 10
   Color 20,20,20
   Rect 140, 400, 10, 94
   schuss ()
   foe ()
   
   WaitTimer timer
   VWait
   Flip 0
Forever


Function foe ()
   If counter_foes<1
      counter_foes=counter_foes+1
      f.foe=New foe   
      f\x=1200
      f\y=474
      f\dead=0
      f\speed=4
      f\dead=0
   EndIf
   
   For f.foe = Each foe
      f\x=f\x-2
      Color 255,0,0
      Oval f\x, f\y, 20,20,1   
      If f\x<150 Then f\dead=1
      If f\dead=1 Then
         Delete f.foe
            counter_foes=counter_foes-1
      EndIf
   Next
End Function


Function schuss ()
   If MouseDown (1) And Player_Lastschuss<MilliSecs() -500 Then
   
      Player_Lastschuss=MilliSecs()
      mx = MouseX ()
      my = MouseY ()
      s.shot = New shot
      s\x = 140
      s\y = 380
      s\drag#=0
      s\winkel = (ATan2 (s\y-my,s\x-mx)+270)Mod 360
      s\dead=0
      Player_Lastschuss=MilliSecs()
   End If
   
   For s.shot = Each shot
      s\y = s\y - Cos(s\winkel)*15
      s\x = s\x + Sin (s\winkel)*15
      s\y = s\y + s\drag#
      s\drag# = s\drag# + 0.2
      
      Color 0,0,0
      Rect s\x, s\y, 10,5,1
      
      If (s\x> 1024) Then s\dead=1
      If (s\y> 494) Then s\dead=1
         If s\dead=1 Then
            Delete s.shot
         EndIf
         
   Next
End Function


Folgendes Problem:

Der "Spieler" befindet sich auf dem schwarzen Balken und soll die roten Kugeln von oben abschießen.
Das Geschoss soll später ein Pfeil sein.

Ich weiß bereits, wie man den Pfeil in ein Dim-Feld einlesen muss, um ihn in alle Grad-Richtungen fliegen lassen zu können.

Dafür benötige ich ja auch eine Winkel-Angabe, z.B. DrawImage Pfeil (Winkel). Diesen Winkel kann man zum Beispiel bei einem Raumschiff leicht durch drücken der Pfeiltasten verändern und so das Raumschiff passend drehen.

Aber ich benötige eine Möglichkeit, um den Pfeil im Flug "richtig" zu drehen. Momentan würde die Sptize des Pfeiles nur in eine Richtung zeigen. Sie soll aber immer steiler zum Boden zeigen, je näher sie dem Einschlagspunkt ist und dann mit der Spitze auch den Boden treffen. (... und später einige Sekunden stecken bleiben Smile )

Dann hab ich mir überlegt, ob man den Einschlagspunkt nicht schon im Voraus berechnen kann, um dann mit dem "ATan2" - Befehl den Winkel zwischen aktueller Flugposition und Einschlagsposition zu berechnen.
Jedoch komme ich nicht darauf, wie man den Einschlagspunkt im Voraus berechnen kann? Oder ob es vllt. bessere Lösungen für dieses Problem gibt.

Ich hoffe, dass das Problem verständlich ist.

Gruß
firstclimber

Midimaster

BeitragMo, Aug 22, 2011 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Geschosse folgen einer Parabel

y=x*x

wobei du aber eine "besonderheiten" beachten musst, damit es wie eine Fugbahn aussieht:

x läuft von -n über 0 nach +n

im Code:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
For i=-10 To 10
y = i*i
Plot 100+i*10, y
Next



Der Pfeil zeigt dabei immer in Richtung des Tangens der Parabel. Leider habe ich keine Ahnung, wie man da den Tangens berechnet.

Zu Not würde auch ein Oval realistisch aussehen. dort lässt sich auch der Tangens gut berechnen.


BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
For i=90 To 270
y = i*i
Plot 150+150*Sin(i) , 85*Cos(i)+300
If i Mod 30 =0
Line 150+150*Sin(i) , 85*Cos(i)+300 , 150+150*Sin(i) +50*Cos(i), 85*Cos(i)+300-50*Sin(i)
Rect 150+150*Sin(i) +50*Cos(i)-2, 85*Cos(i)+300-50*Sin(i)-2,5,5
Flip 1
EndIf

Next



oder so ähnlich...
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

firstclimber

BeitragMo, Aug 22, 2011 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
Geschosse folgen einer Parabel

y=x*x

wobei du aber eine "besonderheiten" beachten musst, damit es wie eine Fugbahn aussieht:

x läuft von -n über 0 nach +n


Das war mir bekannt, Stichwort Flugparabel. Aber ich hab das nicht in meinen Code einbauen können... nach langem Rumrätseln hab ich versucht, das über den Drag-Wert zu lösen.

Midimaster hat Folgendes geschrieben:



Der Pfeil zeigt dabei immer in Richtung des Tangens der Parabel. Leider habe ich keine Ahnung, wie man da den Tangens berechnet.

Zu Not würde auch ein Oval realistisch aussehen. dort lässt sich auch der Tangens gut berechnen.
[/quote]

Ich hab generell noch meine Schwierigkeiten mit sin, cos und tan... Mathe 11/12 Klasse hat man nur sin un cos gemacht, war auch im Grunde genommen einfach, nur muss man das jetzt in ein Programm einbauen.
Tangens gehörte leider nicht zum Schulstoff --> Wie der genau funktioniert weiß ich nicht, müsste mich per google einlernen^^



Gruß firstclimber

Midimaster

BeitragMo, Aug 22, 2011 23:43
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe grad mal meinen vorherigen beitrag aufgemotzt. schau mal nach...
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragMo, Aug 22, 2011 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde aus den jetzigen und den zukünftigen Koordinaten mittels Atan2 den Winkel berechnen - dann sollte der Pfeil doch immer in Flugrichtung zeigen.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

firstclimber

BeitragMo, Aug 22, 2011 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sieht doch echt super aus.

Jetzt muss ich das ganze nur noch "kapieren" und einbauen . Ich melde mich dann wieder. Danke !! Smile

Gruß
firstclimber

Edit:

Zitat:
Ich würde aus den jetzigen und den zukünftigen Koordinaten mittels Atan2 den Winkel berechnen - dann sollte der Pfeil doch immer in Flugrichtung zeigen.


Ja genau so habe ich mir das eigentlich ursprünglich gedacht. Nur komm ich nicht darauf, wie ich zukünftige Koordinaten berechnen kann?

Midimaster

BeitragMo, Aug 22, 2011 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
For i=-15 To 15
y = i*i

Plot 100+i*10, y

If i Mod 3=0
Line 100+i*10, y ,100+(i+1)*10 , (i+1)^2
EndIf
Flip 1
Next
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
  • Zuletzt bearbeitet von Midimaster am Di, Aug 23, 2011 0:01, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMo, Aug 22, 2011 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Du bewegst den Pfeil doch mit bekannter Geschwindigkeit und änderst so ständig die Koordinaten. Du musst bloß x/y und x/y + x/yspeed verwenden. Kann auch sein, dass sich die Koordinaten dann wieder rauskürzen... lang nicht mehr gemacht.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

count-doku

BeitragDi, Aug 23, 2011 8:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

einfache Berechnung des Winkels mit Atan2 mit bekannten Start- und Zielkoordinaten.
Danach dann mit Sin/Cos bewegen und den Winkel auch für DrawImage benutzen...

BlitzBasic: [AUSKLAPPEN]
Local Winkel#=ATan2(ZielY-AktuellY, ZielX-AktuellX); Winkel zum Zielpunkt berechnen
AktuellX=AktuellX+Cos(Winkel)*speed; Objekt bewegen ; Speed ist die Bewegungsgeswindigkeit...
AktuellY=AktuellY+Sin(Winkel)*speed


Hoffe es hilft,
count-doku
 

firstclimber

BeitragDo, Aug 25, 2011 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die Anregungen und Tipps!!!
Habs jetzt endlich hinbekommen Smile

Es hat nur nicht gereicht, nur den ATan2 zum Zielort zu nehmen, sonst würde der Pfeil auch bei der "Aufwärts"-Bewegung zum Ziel zeigen und nicht nach oben.

Ich habe jetzt folgenden "Flug"-Code:

Code: [AUSKLAPPEN]

s\t1# = s\t1# + .1
s\x# = start_x + speed# * s\t1 * Cos(s\winkel#)
s\y# = start_y - (-g#/2) * s\t1^2 + speed# * s\t1 * Sin(s\winkel#)


Zusätzlich lasse ich den Scheitelpunkt und den Einschlagspunkt der Flugparabel berechnen und den Pfeil dann entweder zum Scheitel oder zum Einschlagspunkt hin drehen (mit ATan2).


Jetzt hätte ich noch eine Frage:
Code: [AUSKLAPPEN]

If (shot_counter >= 1) Then
     crash_shot=ImagesCollide (unit, f\x, f\y, 0, arrow (s\winkel), s\x, s\y, 0)
EndIf


Zum oberen Code: Wieso bringt der mir ständig, "Variable must be a Type"?
Das Bild Arrow hab ich in ein Dim-Feld gespeichert von 0 bis 359.
In der Befehlsdatenbank steht, dass der Code bei neueren Karten Probleme macht. Gibt es Alternativen?

Gruß
firstclimber

Xeres

Moderator

BeitragDo, Aug 25, 2011 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es eine lokale Instanz von f?

Ersatzfunktionen findest du hier: FAQ: ImagesCollide & Memory Access Violation ?!
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

firstclimber

BeitragDo, Aug 25, 2011 11:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Was meinst du mit lokaler Instant von f?

Danke für den Link!

Gruß
firstclimber

Xeres

Moderator

BeitragDo, Aug 25, 2011 11:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Um auf ein Foe-Objekt zugreifen zu können, muss es eins geben. Poste doch bitte die Funktion.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragDo, Aug 25, 2011 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
da hast du glaube ich, was falsch verstanden:
Zitat:
....Es hat nur nicht gereicht, nur den ATan2 zum Zielort zu nehmen,....


Der Pfeil-Atan2 wird immer aus der aktuellen Position und der kommenden nächsten Position ausgerechnet.

Mit "Ziel" meinte count-doku also die nächste Pfeilposition auf der Flugbahn

angenommen stepp# ist der x-Schritt, um den sich der Pfeil jedes mal vorwärtsbewegt....
dann ist die nächste Position (x+stepp)....

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
Pfeil=CreateImage(30,5)
Line 0,3,25,3
Rect 27,2,3,3

GrabImage Pfeil, 0,0
MidHandle Pfeil
Const Stepp#=3
For x#=-150 To 150 Step Stepp

yAkt# = (x/10)^2
yNext#= ((x+stepp)/10)^2

Plot 300+x, yAkt+305
Winkel# = ATan2( (x+stepp) -xi , yNext - yAkt )
Winkel = - Winkel + 90
DebugLog winkel + " " + (yNext - yAkt)
If i Mod 30=0
locImage= CopyImage(Pfeil)
RotateImage locimage, Winkel
DrawImage locImage, 300+x , yAkt+300
EndIf
Flip 1
Next

WaitKey()
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
  • Zuletzt bearbeitet von Midimaster am Do, Aug 25, 2011 12:46, insgesamt 5-mal bearbeitet
 

firstclimber

BeitragDo, Aug 25, 2011 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Function foe ()
   If counter_foes<1
      counter_foes=counter_foes+1
      f.foe=New foe   
      f\x=1200
      f\y=464
      f\dead=0
      f\speed=4
      f\dead=0
   EndIf
   
   For f.foe = Each foe
      f\x=f\x-2
      DrawImage unit, f\x, f\y   

      If f\x<150 Then f\dead=1
      If (shot_counter >= 1) Then
         crash_shot=ImagesCollide (unit, f\x, f\y, 0, arrow (s\winkel), s\x, s\y, 0)
      EndIf
                If crash_shot True Then f\dead=1

      If f\dead=1 Then
         Delete f.foe
            counter_foes=counter_foes-1
      EndIf
   Next
End Function


Das ist die Funktion

@ Midimaster

Ah so hat er das gemeint... würde die ganze Sache natürlich noch besser machen. Danke für den Code, ich schau mal, wie ich den Code einbauen kann.

Gruß
firstclimber

Midimaster

BeitragDo, Aug 25, 2011 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab den code grad nochmal überarbeitet!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragDo, Aug 25, 2011 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, dann halt direkt anders herum: In der Funktion gibt es keinen Shot-Type. Du müsstest da an passender Stelle eine For...each Shot Schleife einfügen, sonst ist s=Null.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

firstclimber

BeitragDo, Aug 25, 2011 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank nochmal Smile

Beide Sachen funktionieren nun einwandfrei.

Gruß
firstclimber

ZEVS

BeitragDo, Aug 25, 2011 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht ganz, wieso du den Flug mit einer Parabel berechnest. Das funktioniert zwar, aber als Vektor finde ich es persönlich einfacher und realistischer (die Parabel entsteht durch permanente Einwirkung von Gravitation und Trägheit). Damit lassen sich auch Effekte, wie z.B. Abprallen, Reibung, Durchschlagen von Objekten (mit Verlangsamung), Ergreifung von Explosionen etc. leichter coden.

Ob du das jetzt noch änderst ist deine Sache, beim nächsten mal würde ich es aber gleich mit Vektoren programmieren.

ZEVS
 

firstclimber

BeitragDo, Aug 25, 2011 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Vektoren habe ich bisher noch absolut keine Erfahrung. Mit Trigonometrische Funktionen und Parabeln hatte ich ja auch vor einiger Zeit in der Schule was zu tun.

Gruß
firstclimber

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group