Ein Geschoss im Flug rotieren lassen?
Übersicht

firstclimberBetreff: Ein Geschoss im Flug rotieren lassen? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo zusammen ![]() Seid einigen Tagen beschäftige ich mich mit BlitzBasic und komme momentan nicht weiter ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 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 oder so ähnlich... |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
firstclimber |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit 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. | ||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
firstclimber |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das sieht doch echt super aus.
Jetzt muss ich das ganze nur noch "kapieren" und einbauen . Ich melde mich dann wieder. Danke !! ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic: [AUSKLAPPEN] Graphics 800,600 |
||
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
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
count-doku |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
einfache Berechnung des Winkels mit Atan2 ![]() 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 Hoffe es hilft, count-doku |
||
firstclimber |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank für die Anregungen und Tipps!!!
Habs jetzt endlich hinbekommen ![]() 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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
firstclimber |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was meinst du mit lokaler Instant von f?
Danke für den Link! Gruß firstclimber |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich hab den code grad nochmal überarbeitet! | ||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
firstclimber |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank nochmal ![]() Beide Sachen funktionieren nun einwandfrei. Gruß firstclimber |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group