Collision Triangle/Rectangle & Collision Line....?

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Collision Triangle/Rectangle & Collision Line....?

    Hi Leute!


    Ich bin gerade am programmieren der "KI" für mein Projekt. Jetzt stehe ich jedoch vor einem kleinen Problemchen.
    Undzwar haben die Gegner (Zombieees^^) eine "Sichtrange". Da es ein Zombie-Survival-Game wird, wird es auch ein paar Stealth-Elemente geben. Zombies sollen also nur sehen, was sich vor ihnen befindet. Wie ich das später dann mit dem "Hören" mache weiß ich noch nicht. Es wäre ja sinnlos wenn man hinter einem Zombie rumballert und dieser apathisch die Wand anstarren würde.


    Gut, mein Problem ist jetzt aber erst mal ein Collision_Rectangle abzufragen. Macht so eines überhaupt Sinn? Eine eigene Funktion dafür hat der GM ja leider nicht. Vielleicht wäre ein Collision_Rectangle aber auch besser, um die Augenwinkel anzutäuschen. Nun zu meiner frage: Mit welcher Funktion setze ich die x2,y2.. Werte in Relation zu der Rotation (Blickrichtung) des Zombies? Da es auch Wände geben wird muss ich auch diese berücksichtigen lassen. Wäre es zu rechenintensiv ein Collision_Rectangle mit einer Collision Line zu verbinden?


    GML-Quellcode

    1. if collision_rectangle(x,y,x+Rotationsumwandlungswertgeometrieundso,y+Rotationsumwandlungswertgeometrieundso,ally,1,1) && collision_line(x,y,x+Rotationsumwandlungswertgeometrieundso,y+Rotationsumwandlungswertgeometrieundso,ally,1,1)
    2. {
    3. //Zum Spieler gehen
    4. }



    Ich habe mal ein Bild angefügt. Hoffe man kann erkennen was ich will.^^


    LG
    Bilder
    • collision_rectangle.jpg

      60,27 kB, 639×605, 186 mal angesehen
  • Wenn ich das richtig verstanden habe, dann möchtest du wissen wie du die collision_rectangle funktion beschreiben musst damit sich die beiden Endpunkte des Rechtecks mit dem Player im richtigen Verhältnis drehen.

    Dafür gibt es im GameMaker eine Funktion die sich lengthdir nennt



    GML-Quellcode

    1. lengthdir_x(len,dir)
    2. Gibt die horizontale x-Komponente von dem Vektor bestimmt durch die
    3. gegebene Länge und Richtung wieder.
    4. lengthdir_y(len,dir)
    5. Gibt die vertikale y-Komponente von dem Vektor bestimmt durch die
    6. gegebene Länge und Richtung wieder.


    Dein Code müsste dann ca so aussehen

    GML-Quellcode

    1. if collision_rectangle(x,y,x+lengthdir_x(len,dir),y+lengthdir_y(len,dir),ally,1,1)

    ist so en Art Zeiger der ne Länge und ne Richtung besitzt, damit sollte es klappen
    gegebenenfalls solltest du mal die GM- Hilfe anschauen

    Ne Alternative wäre du zeichnest dir ein Sprite das die Größe deines Sichtfeldes besitz und fragst dann per Collision ab, ob sich der Player in diesem Berech befindet... das Sprite machst dann halt transparent, und lässt es mit dem Gegner mitdrehen.


    Grüßle Blayde
  • Wie henrik1235 es schon gesagt hat, du kannst ein collision_rectangle nicht drehen. Es reicht allerdings, wenn du dir die point_direction vom Zombie zum Spieler ausrechnest und sie mit der Blickrichtung des Zombies vergleichst. Zieh dafür einfach den einen Winkel vom anderen ab und nimm den Betrag davon. Dann hast du den Winkelunterschied. Ist dieser größer als ein bestimmter Wert, z.B. 45° (in beide Richtungen, d.h. insgesamt hätte der Zombie ein Sichtfeld von 90°), kann der zombie den Spieler nicht sehen. Sollte der Unterschied kleiner sein, prüfst du zusätzlich mit einer Collision_line von Zombie zu Spieler, ob er die direkte Sicht hat (z.B. keine Mauer dazwischen).

    © 2008 by Teamgrill Productions