Katapultspiel programmieren? / Physikkenntnisse??

  • VB.NET

Es gibt 51 Antworten in diesem Thema. Der letzte Beitrag () ist von ChillTime.

    Katapultspiel programmieren? / Physikkenntnisse??

    Hallo,

    ich wollte mal fragen ob es sehr schwer ist ein Katapultspiel zu programmieren.
    Also eine Kugel soll durch Klicken abgeschossen werden und man muss versuchen
    ein Ziel zu treffen. Durch die länge des Klickens wird die Kraft festgelegt und wo man
    klickt dadurch wird die Flugkurve festgelegt...
    Hier mal eine Zeichnung:



    Jetzt wollte ich mal wissen wie man daran gehen würde das zu proggen... und ob
    das überhaupt für Anfäger-Forgeschrittene möglich ist? ;)

    Mfg
    ChillTime

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ChillTime“ ()

    Wie schon gesagt würd ich keine Kurve berechnen sondern einfach in jedem Frame die neue Position.
    Wenn abgeschossen wird speicherst du den Punkt an dem sich die Kugel befindet, den Winkel und eben deren Anfangsgeschwindigkeit (v0).
    In jedem Frame berechnest du einfach die neue Gechwindigkeiten(als vektoren):

    VX-Richtung = v0 · cos(Alpha)
    VY-Richtung = v0 · sin(Alpha) - g · t

    v0 ist die anfangsgeschwindikeit
    Alpha ist der Winkel
    g ist die Gravitation = 9,81
    t ist die vergangene Zeit

    Die multiplizierst du dann mit der vergangenen zeit seit dem letzten Frame und addierst sie dann einfach zum aktuellen Punkt.
    Und wenn ich nichts vergessen hab sollte der Ball dann realistisch fliegen ^^
    mfg.skyscater

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „skyscater“ ()

    Warum willst du dann ein Spiel mit GDI machen?!

    Wenn du dich "fast noch nie mit Gdi+ befasst" hast, guck dir doch erstmal die Klasse an.
    Alle Funktionen/Methoden und Einstellungsmöglichkeiten. Probiere dann ein wenig rum und schon ist alles viel einfacher.

    VB.NET-Quellcode

    1. [Gameloop] 'ist bei dir jetzt z. B. ein Timer mit deinem Persönlichen Intervall.
    2. AnimationUpdate()
    3. DrawImage(&image, x, y, srcx, srcy, srcwidth, srcheight) 'Mit GDI DrawImage den Frame zeichnen. | srcx, srcy, srcwidth, srcheight aus dem SourceRectangle der Update funktion
    4. [Gameloop Ende]
    5. Sub AnimationUpdate()
    6. elapsedTime += CInt(ElapsedGameTime.TotalMilliseconds) 'ElapsedGameTime ist die vergangene Zeit seit dem letzten Update
    7. If elapsedTime > frameTime Then 'frameTime ist die Zeit, wielange ein Frame in der Animation gezeigt werden soll (Animationgeschwindigkeit).
    8. currentFrame += 1
    9. If currentFrame = frameCount Then
    10. currentFrame = 0
    11. 'Wenn nicht ge-loopt werden soll, kannst du hier eine "Aktiv" Variabel = False setzen!
    12. End If
    13. End If
    14. SourceRectangle = currentFrame * Width, 0, FrameWidth, FrameHeight 'Kannst das System noch ausbauen und den Y Wert erhöhen wenn benötigt!
    15. 'SourceRectangle ist jetzt das Rechteck mit den Koordinaten des richtigen Frames.
    16. elapsedTime = 0
    17. End Sub


    Ohne XNA steht dir Gametime nicht zur verfügung, deshalb musst du dir die selber Definieren.
    Wenn etwas unklar ist, frag nach.

    Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von „Eistee“ ()

    skyscater schrieb:

    Wie schon gesagt würd ich keine Kurve berechnen sondern einfach in jedem Frame die neue Position.
    Wenn abgeschossen wird speicherst du den Punkt an dem sich die Kugel befindet, den Winkel und eben deren Anfangsgeschwindigkeit (v0).
    In jedem Frame berechnest du einfach die neue Gechwindigkeiten(als vektoren):

    VX-Richtung = v0 · cos(Alpha)
    VY-Richtung = v0 · sin(Alpha) - g · t

    v0 ist die anfangsgeschwindikeit
    Alpha ist der Winkel
    g ist die Gravitation = 9,81
    t ist die vergangene Zeit

    skyscater schrieb:

    Die multiplizierst du dann mit der vergangenen zeit seit dem letzten Frame und addierst sie dann einfach zum aktuellen Punkt.
    Und wenn ich nichts vergessen hab sollte der Ball dann realistisch fliegen ^^
    mfg.skyscater
    Was muss ich jetzt genau multiplizieren?
    Das:
    VX-Richtung = v0 · cos(Alpha)
    Mit:
    der vergangenen Zeit?


    Edit:
    Ich hab das jetzt mal ausprobiert aber i-wie hab ich kein Plan was ich rechnen soll...


    VB.NET-Quellcode

    1. RichtungVX = GeschwinAnfang * Math.Cos(WinkelAlpha)
    2. RichtungVY = GeschwinAnfang * Math.Sin(WinkelAlpha) - Gravitation * Time
    3. lblGeschinVY.Text = RichtungVY
    4. lblGeschinVX.Text = RichtungVX

    Aber da komm Zahlen raus mit unendlichen Kommastellen und mal sind sie Positiv mal Negative :D
    Ich hab das leider noch nicht ganz verstanden.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ChillTime“ ()

    Wie wär's nicht von einer absoluten Startsituation auszugehen, sondern immer vom aktuellen aus das nächste zu berechnen.
    So spart man sich die Zählervariable (Nebensache).
    Ich gebe den Objekten immer eine X und Y Geschwindigkeit und zähle zur Y Geschwindigkeit die Gravitation dazu. Das gibt eine perfekte Parabel.
    Ich hab im Showroom ein kleines Projekt mit dem Name Physik Test (Ich hoffe das kommt jetzt nicht als Eigenwerbung rüber).
    Vielleicht hilft Dir das weiter.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils