Erfassen und neutralisieren eines Feindes [gelöst]

  • GM 8

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

  • Erfassen und neutralisieren eines Feindes [gelöst]

    Hallo miteinander! ;)

    Ich arbeite derzeit an einem 2D-Spiel (vom Aufbau ähnlich einem Platformer wie 'Super Mario') in welchem man Strichmännchen spawnen kann, welche automatisch mit Objekten in der Umgebung interagieren etc.

    Wird das Strichmännchen mit der Pistole ausgerüstet, verwandelt es sich in das Objekt "HUM_PISTOL" (Also das Strichmännchen bloß mit ner Knarre und einer Munitionsanzahl von '8'.

    Dieses Objekt soll - wenn das Objekt "ZOMBIE" auf selber Y-Höhe ist (also relativ: 0) und bis zu einem Abstand von 400 (X-Achse) entfernt - mit der Chance von 1-30 einen Pistolenschuss abgeben. Dabei soll auch beachtet werden: Hat das Objekt "HUM_PISTOL" gerade den Sprite "hum_pistol_go_r" oder "hum_pistol_stand_r", soll das Objekt "BULLET" nach rechts fliegen. Hat "HUM_PISTOL" hingegen gerade den Sprite "hum_pistol_go_l" oder "hum_pistol_stand_l", soll das Objekt BULLET nach links fliegen. In beiden Fällen mit einer Geschwindigkeit von 12.

    Nun zu den eigentlichen 'Problemen':

    1.) Momentan bin ich so weit, dass das Objekt "HUM_PISTOL" erkennt, ob der Zombie in der Nähe ist. Es führt auch die Feuer-Anweisung aus etc, nur da ich 'distance_to_object(ZOMBIE)' verwende (nehm ich mal an), feuert das Objekt "HUM_PISTOL" auch dann, wenn der Zombie in Wirklichkeit ein Stockwerk weiter oben ist. Gibt es eine Alternative dazu oder muss man dazu noch etwas hinzufügen, damit er auch bloß dann feuert, wenn der Zombie auf gleicher Höhe ist wie das Objekt "HUM_PISTOL" ?

    2.) Dummerweise feuert mein Strichmännchen auch dann nach rechts, wenn der Sprite des Objektes nach links zeigt. Dabei (D&D) lautet die Anweisung:

    :action_ifvariable: if sprite_index is equal to hum_pistol_stand_l
    :action_begin:
    :action_ifdice: with a chance of 1 out of 30 do perform the next action
    :action_createspeed: create instance of object BULLET_PISTOL at relative position (0,0) with speed -12 in direction 0
    :action_end:

    Muss dort noch ein Parameter gesetzt werden, damit das Objekt tatsächlich die Geschwindigkeit von -12 annimmt?


    Ich danke für jede Antwort zu egal welchem der zwei Probleme. :)

    - mfG. DarkViper

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

  • also...
    ich kann es dir in Code erklären(Eigentlich gaaaanz einfach).
    Das einfach als "execute code" unter dem Würfel-Symbol einfügen:

    GML-Quellcode

    1. zombie = instance_nearest(x,y,obj_zombie) //Schaut welcher Zombie am nächesten ist und setzt diesen als "zombie" fest.
    2. aim_direction = point_direction(x,y,zombie.x, zombie.y) //Visiert den Zombie an.
    3. if distance_to_point(x,y,zombie.x, zombie.y) //Viel genauer als distance_to_object
    4. {
    5. //Checkt, ob es überhaupt möglich ist den Zombie zutreffen
    6. if collision_line(x,y,zombie.x,zombie.y,obj_zombie,1,DER_SOLDAT) //DER_SOLDAT ist einfach ein leeres Objekt ohne funktionen, dass du den
    7. //einzelnen Animationsobjekten des Schützen als PARENT zuweißt...(PARENT --> Hilfe lesen, wenn du es nicht weißt ;D)
    8. {
    9. bullet = instance_create(x,y,BULLET)
    10. // nun werden der Kugel noch die Variablen zu gewiesen
    11. bullet.direction = aim_direction
    12. bullet.speed = 12
    13. }
    14. }
    Alles anzeigen


    Ein sehr einfacher und gut strukturierter Code. Wenn du über die Funktionen mehr erfahren willst,
    lies in der Hilfe nach. ;) Bei diesem Code ist das checken der Objekte egal (und überhaupt...
    Warum Objekte und nicht Sprites?).

    Mfg
    Diesel
  • Hey.

    Zunächst: Danke für die schnelle Antwort. :)

    Ich habe den Code mal ausprobiert.
    Allerdings zeigt mir das Programm folgenden Fehler:

    GML-Quellcode

    1. ERROR in
    2. action number 59
    3. of Step Event
    4. for object HUM_PISTOL:
    5. Error in code at line 2:
    6. aim_direction = point_direction(x,y,zombie.x, zombie.y) //Visiert den Zombie an.
    7. ^
    8. at position 45: Unknown variable x


    Ich habe mal versucht zombie.x und -.y durch zombie_x und -_y zu ersetzen. Allerdings brachte das auch nichts. :pinch:

    Ich habe den Code wie folgt eingebaut:

    :event_step: Step Event
    :action_begin:
    :action_ifvariable: if sprite_index is equal to hum_pistol_go_r
    :action_begin:
    :action_ifdice: Chance von 1-30
    :action_code: Den folgenden Code ausführen.

    GML-Quellcode

    1. zombie = instance_nearest(x,y,ZOMBIE) //Schaut welcher Zombie am nächesten ist und setzt diesen als "zombie" fest.
    2. aim_direction = point_direction(x,y,zombie.x, zombie.y) //Visiert den Zombie an.
    3. if distance_to_point(zombie.x,zombie.y) //Viel genauer als distance_to_object
    4. {
    5. //Checkt, ob es überhaupt möglich ist den Zombie zutreffen
    6. if collision_line(x,y,zombie.x,zombie.y,ZOMBIE,1,DER_SOLDAT) //DER_SOLDAT ist einfach ein leeres Objekt ohne funktionen, dass du den
    7. //einzelnen Animationsobjekten des Schützen als PARENT zuweißt...(PARENT --> Hilfe lesen, wenn du es nicht weißt ;D)
    8. {
    9. bullet = instance_create(x,y,BULLET_PISTOL)
    10. // nun werden der Kugel noch die Variablen zu gewiesen
    11. bullet.direction = aim_direction
    12. bullet.speed = 12
    13. }
    14. }
    Alles anzeigen


    :action_end:
    :action_else:
    :action_ifvariable: if sprite_index equal to hum_pistol_stand_r
    :action_begin:
    :action_ifdice: Chance von 1-30
    :action_code: Der identische Code.
    :action_end:

    :action_begin:
    :action_end:
    :action_end:

    Da drunter habe ich das ganze noch einmal genauso eingefügt. Nur dass hum_pistol_go_r und hum_pistol_stand_r eben hinten ein 'l' tragen. Das Objekt HUM_PISTOL verfügt über die PARENT 'DER_SOLDAT'.

    ----------------------------

    (und überhaupt...
    Warum Objekte und nicht Sprites?).
    Ich dachte das wird zu kompliziert, wenn ich alles in ein Objekt schreibe. :D
    Immerhin sollen die Strichmännchen ja später jeden Mist aufheben und als Waffe benutzen können.
    Nebenbei dann noch z.B. Türen öffnen, und/oder an zahlreichen Waffen, die man als 'Gott' dieser Welt vom Himmel regnen lassen kann äh... sagen wir 'scheitern' 8) ... etc.


    - mfG. DarkViper
  • Also wie sich aus dem Problem erkennen lässt kennt er die Instance die zuvor als zombie bezeichnet wird nicht.
    Hast du Zombies in dem Room? Also wenn du keine hast kommt, dieser Fehler nomalerweise.
    Sonst müsste es eigentlich funktionieren.
    Wenn mal kein zombie da sein kann, musst du einen CountCheck vor dem Code einbauen.

    Diesel
  • Hmm... offenbar hab ich irgendwas falsch eingegeben gehabt. Habs nochmal neu gemacht, jetzt gehts. :D

    Zwei kleine Fragen zu dem Code hätte ich noch. :)

    1.) EDIT: Okay... Frage 1 hat sich erledigt. Ich dachte es feuert nur bei Kollision, weil es so diagonal schießt. X( Ein Höhen-Test hat das Gegenteil bewiesen.

    und

    2.) Kann man einstellen, dass der Punkt, welchen das Strichmännchen nun anvisiert um den Zombie zu treffen irgendwoanders liegt? Die Sache ist die: Wenn das Strichmännchen feuert, schießt es diagonal nach unten unter den Zombie. Vermutlich deshalb weil ich die Sprites alle 4 Pixel hoch schweben lasse damit sie nicht im Boden stecken bleiben. Ich muss den Punkt also so verschieben, dass er im Körper des Zombies liegt.

    Ansonsten für die bisherige Hilfe schonmal ein großes Dankeschön! :thumbsup:

    - mfG. DarkViper

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

  • Dein zweites Problem lässts sich sehr einfach lösen:
    Im Grunde musst du nur bei zombie.y(Also den y-Mittelpunkt vom Zombie)
    einfach eine Zahl an Pixel abziehen:
    also z.B.:

    Ohne Streuung

    GML-Quellcode

    1. point_direction(x,y,zombie.x, zombie.y -10) //Jetzt zielt der Soldat 10 pixel weiter nach oben.


    Mit Streuung

    GML-Quellcode

    1. point_direction(x,y,zombie.x, zombie.y -10 -random_range(-3,3)) //Jetzt zielt der Soldat 7 bis 13 Pixel weiter nach oben.
    2. //Definition der Funktion random_range(x1,x2): Das Spiel sucht sich eine zufällige Zahl zwischen x1 und x2 heraus und gibt diese zurück:
    3. //random_range(1,9)
    4. //Ausgabe: 4


    Jetzt müsste alles gelöst sein. ;)

    Mfg
    Diesel
  • Benutzer online 2

    2 Besucher