Zielen für Anfänger



  • Hallo zusammen,

    ich schreibe gerade ein kleines (und mein erstes) Spiel in C/C++ mit SDL. Klappt soweit auch alles ganz gut, jedoch bin ich wohl in Mathematik ein wenig schwächer geworden. Also, ich habe ein Gebäude auf einer 2D-Map. Von dem aus soll ein Schuß abgefeuert werden, wenn sich ein Gegner auf dem Spielfeld bewegt. Zu diesem Zweck habe ich die Koordinaten des Gebäudes, wo der Schuß starten soll und die Koordinaten des Gegners, wo der Schuß enden soll. Daraus habe ich auch die Geradengeleichung berechnet. Jetzt will ich die X- und die Y-Komponente des Schusses so aktualisieren, daß er auch in Richtung des Gegner schießt. Das gelingt mir einfach nicht. Muß ich die Vektorrechnung dafür bemühen oder reichen Sin / Cos - Berechnungen aus? Wie aktualisiere ich die X und Y Positionen des Schusses, so daß er sich gleichmässig bewegt?

    Danke schon mal für Hilfe
    Yosh

    //neuen Schuß erstellen
             Bullet bull;
             //auf die Koordinaten des Gebäudes setzen
             bull.Setposx(dx1+15);
             bull.Setposy(dy1+15);
             //Zielkoordinaten setzen
             bull.Settargetx((int)dx2);
             bull.Settargety((int)dy2);
    
             //in die liste setzen
             bullets.push_back(bull);
    ...
    ...
    //Upadtes der Schüsse
      for(int i=0;i<bullets.size();i++){
              //Neue X-Position = Alte X-Position +-*/ ???
              bullets[i].Setposx(bullets[i].Getposx()+ ?????? );
              //Neue Y-Position = Alte X-Position +-*/ ???
              bullets[i].Setposy(bullets[i].Getposy()+ ?????? );
      }
    


  • Üblicherweise rechnet man sich den Vektor A->B aus, also "Ziel minus eigene Position". Das ist der Vektor auf dem die Kugel dann fliegen soll.
    Den brauchst du bloss noch normalisieren (=durch die eigene Länge dividieren) und mit der gewünschten Geschwindigkeit zu multiplizieren, dann hast du den Vektor den du pro Zeiteinheit auf die Position der Kugel draufaddierst.



  • also wenn ich dich richtig verstanden habe, hast du bereits eine Gleichung, die die flugbahn der Kugel berechnet, jetzt musst du sie nur noch in abhängigkeit von t (Zeit) machen, und für jeden frame die aktualle Koordinate berechnen, indem du die relative Zeit vom abschusszeitpunkt bis zur aktuellen Zeit an die Gleichung übergibst. Am besten geht sowas mit parametrischen funktionen, also eine funktion für die x-bewegung, und eine Funktion für die y-Bewegung, dann braucht du für t nicht die x achse.

    Beispiel einer flugparabel

    x(t)=tx(t)=t
    y(t)=5t2y(t)=5-t^2

    dann ist das Objekt nach zwei sekunden an position P(2|1)

    Dieser ansatz ist relativ kompiziert, und liefert auch recht schöne ergebnisse, meist ist allerdings ein ansatz, der auf Physik, nicht Mathematik basiert einfacher:

    geschoss erzeugen, und x- und y-Geschwindigkeit bestimmen. Für jeden frame die neue position berechnen, dazu brauchtr man die zeit, die seid dem letzten frame vergangen ist, und multipliziert sie mit der Geschwindigkeit, der so berechnete abstand muss dann zur koordinate hinzuaddiert werden, möchte man noch Gravitation haben, so kann man noch bei jedem frame die y-geschwindigkeit ein bisschen nach unten manipulieren, auch unter berücksichtigung der Zeit. Das ist simpler, und fürt zu schöneren ergebnissen, ist Mathematisch allerdings nicht 100% korrekt, weil ungenauigkeiten entstehen, je weniger FPS das spiel hat.

    Edit: ich hätte mal richtig lesen sollen

    speedx = sin(winkel) * speed
    speedy = cos(winkel) * speed
    

    variablennamen noch anpassen. speedx/y einmal bei erstellung der Kugel berechnen.



  • yosh schrieb:

    Wie aktualisiere ich die X und Y Positionen des Schusses, so daß er sich gleichmässig bewegt?

    Und wenn du die Berechnung der Kugel richtig hast, entweder mittels Vektor oder einfach Sinus/Kosinus, solltest du noch die Bewegung von der verstrichenen Zeit abhängig machen, dass es nicht nur auf deinem Rechner so schnell läuft, wie du willst 😉


Anmelden zum Antworten