Zielsuchend Schiessen



  • Mahlzeit

    Ich hab da mal eine kleine Frage und zwar geht es um folgendes:
    Ich hab einen kleinen Weltraumshooter in DirectX mit C++ geschrieben. Alles Ballert und die KI von den Gegnerischen Raumschiffen schwiert auch schön durch die Gegend.
    Nun zu meiner Frage, ich möchte das sie jedesmal auf mein Raumschiff schiessen.
    Im klartext. Gegnerrisches Raumschiff ist die Startposition meines Schusses und das Spielerraumschiff ist die ZielPosition des Schusses.
    Bisscher schiessen sie einfach nach einer kleinen Funktion immer gardeaus.

    Wie kann ich das umsätzen? gibt es in DirectX eine Funktion die für mich die Berechnung übernimmt?

    Bisscher hab ich mir folgendes gedacht.
    Da ich zwei Punkte im Koordinatensystem habe kann ich ja die Lineare Gleichung ausrechnen, einfache Algebra: y = m*x+b;

    Gibt es denn da nicht eine einfachere Methode

    greetz
    lutschi



  • Wenn du mit Vektoren arbeitest:

    Bilde den Differenzvektor zwischen Spielerschiff und Schiff des Gegners.
    Diesen Vektor kannst du als Richtung des Schusses interpretieren.

    Ich hoffe, ich habe dein Problem richtig verstanden...



  • Und wenn man keine ahnung von Vektoren hat, so wie ich ;), dann kann man den winkel zwischen gegner raumschiff und spieler raumschiff ausrechnen.
    Kennt hier zufällig jemand ne gute deutsche einleitung oder so zu vektoren ?
    In der Schule will und will das net dran kommen .



  • Schon mal bei Wikipedia nach geschaut ?
    Ansonsten sollte auch eine einfache Suche mit google oder eine anderen Suchmaschine ausreichen.

    http://de.wikipedia.org/wiki/Vektor

    Bin irgendwie gerade gut gelaunt ...





  • so ich habe das problem gelöst
    die die sich dafür interessieren hier mein ansatz

    Erst wird der winkel berechent zwischen Gegner und Spieler.
    Diese dann auf das 2D Bild übergeben. Dadurch zeigt das Bild dann auf den Spieler
    Jetzt ne einfach kleine Abfrage.

    if (Schuss.x > Spieler.x)
    Schuss.x--;
    else if(Schuss.x < Spieler.x)
    Schuss.x++;

    if (Schuss.y > Spieler.y)
    Schuss.y--;
    else if(Schuss.x < Spieler.y)
    Schuss.y++;

    Dabei jedesmal den Winkel zwischen Schuss und Spieler ausrechnen und das Schussbild dabei ausrichten lassen.

    sieht nicht schlecht aus einwenig wie so eine verfolgungsrakete.

    einfach nicht wahr
    so simple kann es auch sein

    thx an alle lösungsansätze
    😃



  • Das rockt nicht.

    B-----
          \
           \
            \
             \
              A
    


  • besonders kann das bild dann in eine andere richtung, als es sich eigentlich bewegt, zeigen..
    Wenn du den Winkel schon ausrechst, dann multiplizier doch einfach deinen ursprünglichen bewegungsvektor (z.b. (0;-5)) mit der entsprechenden drehmatrix (bzw. umgekehrt) ..



  • Man kann das irgendwie mit Atan berechnen, keine Ahnung mehr wie, hab ich ich vergessen...



  • sbrog schrieb:

    Man kann das irgendwie mit Atan berechnen, keine Ahnung mehr wie, hab ich ich vergessen...

    Ja genau:

    double getRotation (double x, double y)
    {
    	return atan2 (y, x) / PI * 180;
    }
    

    Diese Funktion hab ich in meinem letzten Game verwendet. Geb dann an x und y die Differenz zwischen Start- und Zielposition ein und du bekommst als Rückgabe deinen Winkel.



  • / PI * 190 muss nicht sein, von daher ist diese "Funktion" etwas sinnlos und dazu auch noch schlecht benannt.

    Bye, TGGC (Keine Macht den Dummen)


  • Mod

    TGGC schrieb:

    / PI * 190

    autsch



  • Soll man direkt mit bogenmas weiter rechnen ?
    Wie benutzt man das ? 🙂



  • / PI * 190

    hehe der unschlüssige der sich nicht entscheiden kann ob er nun den kreis auf 360 Grad oder 400 Grad normt entscheidet sich für den Mittelwert 😃



  • Mortal2006 schrieb:

    Soll man direkt mit bogenmas weiter rechnen ?
    Wie benutzt man das ? 🙂

    autsch²

    Bye, TGGC (Keine Macht den Dummen)



  • k.



  • Windalf schrieb:

    / PI * 190

    hehe der unschlüssige der sich nicht entscheiden kann ob er nun den kreis auf 360 Grad oder 400 Grad normt entscheidet sich für den Mittelwert 😃

    Der Wert ist ja eben völlig egal, also kann man auch 2Pi lassen, vor allem weil alle Funktionen aus cmath usw. ebendies benutzen.

    Bye, TGGC (Keine Macht den Dummen)



  • Benutzt doch den Satz des Pytagoras:
    a u. b == Katheten.
    c folglich die Hypotenuse.

    c² = a² + b²

    Man muss das natürlich für jede Achse berechnen...

    € Ach ja, das soll ein rechtwinkliges Dreieck sein 🙂



  • roan312 schrieb:

    c² = a² + b²

    € Ach ja, das soll ein rechtwinkliges Dreieck sein 🙂

    Sonst nimmst den allgemeineren Fall

    a^2 + b^2 - 2abcos(gamma) = c^2

    Wobei gamma der von a und b eingeschlossene Winkel ist. Fuer rechte Winkel ist das zufaellig Null und siehe da, da ist der alte Pyty wieder 😃

    Ich kann auch nur Vektoren empfehlen, das ist das einfachste und normalerweise auch das schnellste fuer diesen Fall. Wenn man Vektoren nicht kennt, die sollten eigentlich in jedem guten Einfuehrungsbuch zur Spieleentwicklung erlautert werden oder man geht mal in eine Bibliothek und schaut unter "Lineare Algebra", da gibts ne ganze Menge. Ein Kumpel der an der Uni CG lehrt schwoert auf "Lineare Algebra" von Gilbert Strang.

    so far

    Phil


Anmelden zum Antworten