Mehrere Teams - Ziel erkennen

  • Mehrere Teams - Ziel erkennen

    Hallo, ich bin's mal wieder ;)
    Ich arbeite zurzeit an einem TopDownShooter.
    Aber ich will keinen typischen Shooter in dem der Spieler allein kämpfen muss.(Wäre auch nur was für Hardcore Spieler, da man sehr schnell den Geist aufgibt) Ich will das man ein eigenenes Team hat. Da ist noch kein Problem. Allerdings will ich jetzt nicht 2 Teams haben, sondern gleich mehrere. Nun sitze ich hier an der KI und habe keine Ahnung wie ich es jetzt anstelle, das die KI einen Feind als Ziel wählt, denn die Teamangehörigkeit will ich als Variable festlegen.
    Kann mir jemand helfen?

    Die Community die ich einst liebte, ist mehr und mehr zu einer Plattform für kleine Kinder, selbstgerechte Gutmenschen und Heuchler verfallen.
    Viele Jahre habe ich ihr beim Sterben zugesehen aber mittlerweile habe ich alle Hoffnung aufgegeben.

    Golden Sun Camera Sample
    Mechferno Alpha 1.14
    Fruge Beta 3.01

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Sephiroth ()

  • Du kannst doch ein Parent Objekt erstellen, dann stellst du alle Gegnerschiffe auf das erstellte Parent. Dann kannste sowas machen:

    GML-Quellcode

    1. if instance_number(obj_gegner)>0 //Existiert der Gegner?
    2. {
    3. ziel=instance_nearest(x,y,obj_gegner) // Wählt den nähesten Gegner aus
    4. }
    5. else
    6. {
    7. ziel=false //Wenn nicht, ziel = false
    8. }
    9. if collision_line(x,y,ziel.x,ziel.y,ziel,false,true) //Wenn kein Objekt dazwischen ist
    10. {
    11. schiessen = true //soll der Freund schiessen
    12. }
    Alles anzeigen

    Das Skript habe ich auch auskommentiert. Ich hoffe, es hilft dir weiter ;)
  • Du hast das missverstanden. Diese Methode ist mir durch aus bekannt, und ich habe sie bisher immer verwendet. Wenn du meinen Post richtig durchgelesen hättest, wüstest du, dass ich von VARIABLEN als Teams gesprochen habe. Und das ich mehrere Teams haben will und nicht nur 2.

    Die Community die ich einst liebte, ist mehr und mehr zu einer Plattform für kleine Kinder, selbstgerechte Gutmenschen und Heuchler verfallen.
    Viele Jahre habe ich ihr beim Sterben zugesehen aber mittlerweile habe ich alle Hoffnung aufgegeben.

    Golden Sun Camera Sample
    Mechferno Alpha 1.14
    Fruge Beta 3.01

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Sephiroth ()

  • vielleicht geht es mit:

    GML-Quellcode

    1. if instance_number(obj_bot)>0 //Existiert der Bot?
    2. {
    3. ziel=instance_nearest(x,y,obj_bot)
    4. }
    5. else
    6. {
    7. ziel=false //Wenn nicht, ziel = false
    8. }
    9. if collision_line(x,y,ziel.x,ziel.y,ziel,false,true) and ziel.team != team
    10. {
    11. schiessen = true //soll der Freund schiessen
    12. }
    Alles anzeigen


    Edit: Schrift war zu klein
    Edit2: Irgendwie geht die net größer :(
    Edit: Die will net größer werden
    Edit7: War desktopproblem mit drer kleinen schrift :ops:

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von Floz ()

  • Danke, aber so etwas in der Art habe ich auch schon versucht. Nur, wird er dann immer den ihm am nächsten CPU als Ziel wählen, egal ob er feindlich ist oder nicht. Folglich wird er gar nicht schießen, so lange ihm ein Verbündeter am nächsten Steht.

    Die Community die ich einst liebte, ist mehr und mehr zu einer Plattform für kleine Kinder, selbstgerechte Gutmenschen und Heuchler verfallen.
    Viele Jahre habe ich ihr beim Sterben zugesehen aber mittlerweile habe ich alle Hoffnung aufgegeben.

    Golden Sun Camera Sample
    Mechferno Alpha 1.14
    Fruge Beta 3.01
  • Daran habe ich gar net gedacht. Du könntest auch für alle Gruppen ein parent machen. z.B. gegner1 oder gegner2
    und dann den code verwenden: (wwird ein wenig umständlich)

    GML-Quellcode

    1. if instance_number(gegner1)>0 and distance_to_object(instance_nearest(gegner1) > Reichweite // wie weit der bot gucken kann
    2. and distance_to_object(instance_nearest(gegner2)>distance_to_object(instance_nearest(gegner1)
    3. {
    4. ziel=instance_nearest(x,y,gegner1)
    5. }
    6. else
    7. {
    8. ziel=false //Wenn nicht, ziel = false
    9. if instance_number(gegner2)>0 and distance_to_object(instance_nearest(gegner2) > Reichweite
    10. and distance_to_object(instance_nearest(gegner2) < distance_to_object(instance_nearest(gegner1)
    11. then ziel = instnace_nearest(gegner2)
    12. }
    13. if collision_line(x,y,ziel.x,ziel.y,ziel,false,true) and ziel.team != team
    14. {
    15. schiessen = true //soll der Freund schiessen
    16. }
    Alles anzeigen



    So müsste es gehen, ist aber SEHR umständlich. Mir fällt aber gerade nix besseres ein

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

  • probiers mal mit diesem ansatz:

    GML-Quellcode

    1. in = instance_nearest(obj_bot);
    2. if (in.variabele = 0) {
    3. // das was man bei team0 macht
    4. }
    5. if (in.variabele = 1) {
    6. // das was man bei team1 macht
    7. }
    8. if (in.variabele = 2) {
    9. // das was man bei team2 macht
    10. }
    11. // ect.
    Alles anzeigen
    was nichtso schön dabei ist, das möglicherweise ein verbündeter näher steht als ein feind, und er dan nix macht, weil ja noch ein verbündeter dazwischen steht. lösen könntest dudas evtl. mit einem immer größer werdenden kreis bei dem die collision abgefragt wird. (anstadt des instance_nearest)
    :) Nobody is perfect (-:

    "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
  • Ich hab da mal was geschrieben.

    ( DER UPLOAD BEI QUICKSHARING MACHT ZICKEN, deshalb schick ich's Dir per E-mail)

    Vier Parteien (Baby, Geist, Ufo, Bugs), die jeweils optische Signale (Geschosse) in Richtung nächster Feind / nächste Feinde abgeben, und andere (Geschosse) in Richtung nächster Freund / nächste Freunde. Das Herz dieses Programms ist ein folgendes Skript:

    GML-Quellcode

    1. gruppe[1] = team_1_parent
    2. gruppe[2] = team_2_parent
    3. gruppe[3] = team_3_parent
    4. gruppe[4] = team_4_parent
    5. anz_feinde=0;
    6. for (i=0; i <=4; i+=1)
    7. {
    8. if agro[i] = 1 // Feind identifiziert
    9. {
    10. anz_feinde+=1
    11. feind[anz_feinde] = instance_nearest( 128+x,y,gruppe[i] )
    12. }
    13. }
    14. anz_freunde=0;
    15. for (i=0; i <=4; i+=1)
    16. {
    17. if agro[i] = -1 // Freund identifiziert
    18. {
    19. anz_freunde+=1
    20. freund[anz_freunde] = instance_nearest( 128+x,y,gruppe[i] )
    21. }
    22. }
    Alles anzeigen

    Die "Mogelei" hier ist, daß ich 128+ geschrieben habe, weil instance_nearest sonst sich selbst als nächsten Freund erkennt. (In meinem Room sind Objekte links und rechts von 128, also die linken zeigen auf die rechten) Ansonsten funktioniert es so einwandfrei. Ich hoffe, das hilft Dir bei Deinem Problem weiter :) Ach so, und man muß natürlich noch die Variable Agro setzen, also agro [1] = Verhalten gegenüber team1. Bei mir: -1=Freund und 1=Feind

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

  • Danke, nach vielen Problemen(die ich eigentlich selber Schuld war)
    klappt jetzt alles wie es soll.
    Und ich möchte hiermit nochmal auf meinen Ressourcenthread verweisen:
    Grafiker für Halo Fangame gesucht
    Da ich sonst an dem Spiel nicht weitermachen kann. Bzw daraus nichts wird.

    Die Community die ich einst liebte, ist mehr und mehr zu einer Plattform für kleine Kinder, selbstgerechte Gutmenschen und Heuchler verfallen.
    Viele Jahre habe ich ihr beim Sterben zugesehen aber mittlerweile habe ich alle Hoffnung aufgegeben.

    Golden Sun Camera Sample
    Mechferno Alpha 1.14
    Fruge Beta 3.01