gegner sichtfeld

  • GM 8

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

  • gegner sichtfeld

    Ich habe grad das problem das ich für meiene gener eine art sichfeld brauche ich hab mir da gedacht vileicht mit eiener art tortenförmigen objekt welches jedesmal mitbewgt allerdings weiß ich nicht wie ich das mit mehreren gegner und mehreren sichtfeldern machen soll.
    wäre über hilfe dankbar
    Hier mal ne skizze was ich meine:

    Das schwarze ist das blickfeld und halt das gestreifte wo das sichtfeld nicht sein soll
    :rage:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von meav33 ()

  • Du brauchst dafür kein Objekt, point_direction/distance nehmen dir die Arbeit ab.

    GML-Quellcode

    1. var otherEnemy;
    2. otherEnemy = instane_nearest(x, y, oEnemy);
    3. if(!otherEnemy)exit; // Alternativ kannst du schreiben: if(otherEnemy == noone)...
    4. var dir, dis, col;
    5. dir = point_direction(x, y, otherEnemy.x, otherEnemy.y) - myDir; // my Dir ist dann die Richtung, in die der "Spieler" schaut.
    6. if(abs(dir) > 40)exit; // Spieler ist nicht in einem -40° - 40° Winkel zum Spieler.
    7. dis = point_distance(x, y, otherEnemy.x, otherEnemy.y);
    8. if(dis > 256)exit; // Spieler ist zu weit entfernt.
    9. col = collision_line(x, y, otherEnemy.x, otherEnemy.y, oWall, 1, 1);
    10. if(!col)exit; // Die Sicht wird durch ein Objekt gehindert.
    11. // Tu was, mit otherEnemy (ihn zum Beispiel abknallen o.a.)
    12. // Der Code hier wird nur erreicht, wenn der Gegner auch gesichtet wurde.
    Alles anzeigen


    edit: hab grad deinen Edit gesehen, ich änder den Code mal schnell^^
    edit 2: fertig.

    - Tobi97
  • naja das ist ja ganz gut aber wenn ich es richtig verstehe dann geht es auch dürch andre objekt durch ich hab mir das halt so vorgestellt:

    dabei ist allerdings auch noch zu beachten dass sich dieser gegner auch bewegt(imm moment nur rechts -links später aber auch springen )


    hab meinen ersten post auch editiert


    hm was muss ich denn da bei myDir eintragen mein code ist grad so und das geht nicht

    GML-Quellcode

    1. var otherEnemy;
    2. otherEnemy = instance_nearest(x, y, player_01);
    3. if(!otherEnemy)exit; // Alternativ kannst du schreiben: if(otherEnemy == noone)...
    4. var dir, dis, col;
    5. dir = point_direction(x, y, otherEnemy.x, otherEnemy.y) - player_dir; // my Dir ist dann die Richtung, in die der "Spieler" schaut.
    6. if(abs(dir) > 40)exit; // Spieler ist nicht in einem -40° - 40° Winkel zum Spieler.
    7. dis = point_distance(x, y, otherEnemy.x, otherEnemy.y);
    8. if(dis > 256)exit; // Spieler ist zu weit entfernt.
    9. col = collision_line(x, y, otherEnemy.x, otherEnemy.y, obj_parent_floor, 1, 1);
    10. if(!col)exit; // Die Sicht wird durch ein Objekt gehindert.
    11. // Tu was, mit otherEnemy (ihn zum Beispiel abknallen o.a.)
    12. // Der Code hier wird nur erreicht, wenn der Gegner
    13. if player_01.x<=x && hspeed< 0
    14. {shoot = 1
    15. player_dir = 180}
    16. if player_01.x>x && hspeed> 0
    17. {shoot = 1
    18. player_dir = 0}
    19. waited = 0
    Alles anzeigen
    :rage:
  • myDir ist eben die Richtung, in die der, von dem das Sichtfeld ausgeht gerade schaut.
    Du kannst z.B. einfach schreiben:

    GML-Quellcode

    1. if(hspeed < 0){
    2. myDir = 180; // Links
    3. } else {
    4. myDir = 0; // Rechts
    5. }


    - Tobi97
  • Nein, das Problem war, dass du das ganze am Ende hattest.
    Pack das mit der Richtungsbestimmung mal an den Anfang.
    Dann sollte es funktionieren.

    Übrigens: Wenn du Winkel außer 0 und 180 verwenden willst, benutz' das angle_difference script auf gmlscripts.com (Da es sonst Probleme mit negativen Werten geben kann).

    - Tobi97
  • Also erst mal danke kalppt jetz alles außer das der winkel nicht richtig ist der ist in etwa so :


    was muss ich ändern damit er genau wagerecht ist ?

    Hier mal mein überarbeiteter Code

    GML-Quellcode

    1. if waited = 1{
    2. if player_01.x<=x && hspeed< 0
    3. {
    4. player_dir = 180
    5. var otherEnemy;
    6. otherEnemy = instance_nearest(x, y, player_01);
    7. if(!otherEnemy)exit; // Alternativ kannst du schreiben: if(otherEnemy == noone)...
    8. var dir, dis, col;
    9. dir = point_direction(x, y, otherEnemy.x, otherEnemy.y) - player_dir; // my Dir ist dann die Richtung, in die der "Spieler" schaut.
    10. if(abs(dir) > 40)exit; // Spieler ist nicht in einem -40° - 40° Winkel zum Spieler.
    11. dis = point_distance(x, y, otherEnemy.x, otherEnemy.y);
    12. if(dis > 320)exit; // Spieler ist zu weit entfernt.
    13. col = collision_line(x, y, otherEnemy.x, otherEnemy.y, obj_parent_floor, 1, 1);
    14. if(!col)exit; // Die Sicht wird durch ein Objekt gehindert.
    15. // Tu was, mit otherEnemy (ihn zum Beispiel abknallen o.a.)
    16. // Der Code hier wird nur erreicht, wenn der Gegner
    17. shoot = 1
    18. waited = 0
    19. }
    20. if player_01.x>x && hspeed> 0
    21. {
    22. player_dir = 0
    23. var otherEnemy;
    24. otherEnemy = instance_nearest(x, y, player_01);
    25. if(!otherEnemy)exit; // Alternativ kannst du schreiben: if(otherEnemy == noone)...
    26. var dir, dis, col;
    27. dir = point_direction(x, y, otherEnemy.x, otherEnemy.y) - player_dir; // my Dir ist dann die Richtung, in die der "Spieler" schaut.
    28. if(abs(dir) > 40)exit; // Spieler ist nicht in einem -40° - 40° Winkel zum Spieler.
    29. dis = point_distance(x, y, otherEnemy.x, otherEnemy.y);
    30. if(dis > 320)exit; // Spieler ist zu weit entfernt.
    31. col = collision_line(x, y, otherEnemy.x, otherEnemy.y, obj_parent_floor, 1, 1);
    32. if(!col)exit; // Die Sicht wird durch ein Objekt gehindert.
    33. // Tu was, mit otherEnemy (ihn zum Beispiel abknallen o.a.)
    34. // Der Code hier wird nur erreicht, wenn der Gegner
    35. shoot = 1
    36. waited = 0
    37. }
    38. }
    Alles anzeigen








    Ps weiß jemand wie ich meinen jetzt doch sehr langen code kürzen kann
    mir fehlt so eine art

    Quellcode

    1. if a=b or if a=c then Funktion
    :rage:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von meav33 () aus folgendem Grund: erweiterung

  • Ja, es geht in der Tat etwas kürzer:

    GML-Quellcode

    1. // enemy_check_view (target, view angle, view distance);
    2. var check_view_visible, check_view_angle, check_view_distance;
    3. check_view_visible = !collision_line(x, y, argument0.x, argument0.y, obj_parent_floor, false, true);
    4. check_view_angle = (((point_direction(x, y, argument0.x, argument0.y) + ((hspeed < 0) * 180) + argument1/2) mod 360) <= argument1);
    5. check_view_distance = point_distance(x, y, argument0.x, argument0.y) <= argument2;
    6. return (check_view_visible && check_view_angle && check_view_distance);


    So würde man das Skript zu deinem Code adaptieren:

    GML-Quellcode

    1. if (waited) {
    2. if (enemy_check_view(player_01, 40, 320)) {
    3. // do something
    4. waited = true;
    5. }
    6. }


    Achja: Wenn hspeed des Gegners gleich den Wert "0" annimmt solltest du dies extra behandeln...

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von cafaxo ()

  • Ja, es geht in der Tat etwas kürzer:

    GML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // enemy_check_view (target, view angle, view distance);

    var check_view_visible, check_view_angle, check_view_distance;

    check_view_visible = collision_line(x, y, argument0.x, argument0.y, obj_parent_floor, false, true);
    check_view_angle = (((point_direction(x, y, argument0.x, argument0.y) - ((hspeed < 0) * 180) + argument1/2) mod 360) <= argument1);
    check_view_distance = point_distance(x, y, argument0.x, argument0.y) <= argument2;

    return (check_view_visible && check_view_angle && check_view_distance);






    da ist leider ein kleiner fehler er gibt true raus
    WENN ein hindernis dazwischen liegt ersoll aber
    DANN true rausgeben wenn kein opjekt dazwischen liegt .


    ich habs mit

    GML-Quellcode

    1. if check_view_collision = true
    2. check_view_range = false
    3. else
    4. check_view_range = true

    versucht geht aber nicht






    edit habs selbst einfach ein ! vorstellen :headtouch:
    nur es besteht immer noch das problem das das sichtfeld nicht wagerecht ist sonder jetzt sogar ein wenig nach oben
    :rage:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von meav33 ()

  • Ich habe nun noch einen kleinen, dummen Fehler korrigiert. Jetzt sollte es funktionieren...

    Edit:
    Der Fehler war bei:

    GML-Quellcode

    1. check_view_angle = (((point_direction(x, y, argument0.x, argument0.y) - ((hspeed < 0) * 180) + argument1/2) mod 360) <= argument1);

    Statt "- ((hspeed < 0) * 180)" sollte es "+ ((hspeed < 0) * 180)" heißen, da das Skript sonst bei "hspeed < 0" falsche Winkelmaße einbeziehen würde.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von cafaxo ()