Mehr als ein Gegner und die Healthbar

  • GM 7
  • Mehr als ein Gegner und die Healthbar

    Hallo zusammen,
    ich weiß, dass ich mir jetzt bestimmt den Unmut von einigen Leuten hier zuziehe, aber scheinbar bin ich einfach zu doof, um die
    bisher beantworteten Fragen & ihre Antworten zu verstehen.
    Im Anhang habe ich einen Turm, der auf ALLE in seiner Nähe auftauchenden Ziele (object0) schießen soll.
    Tut er aber nicht. Er schießt immer nur auf das zuerst erstellte Ziel und erst wenn das zerstört ist sieht er überhaupt
    erst das zweite.
    Was mache ich da falsch? Mit der ID der objekte hab ich herumprobiert bis zum umfallen, aber ich verstehe das nicht wirklich.
    Genauso geht es mir mit der Healthbar. Es wird immer nur die des zuerst erstellten Objekts angezeigt, diese verändert sich gar nicht.
    Wenn aber irgendwann das zuerst erstellte objekt0 zerstört ist, dann funktioniert die Leiste.
    Liegt wahrscheinlich ebenfalls an einer (wegen meiner absoluten Unverständnis nicht vergebenen) ID, aber wie schon bemerkt:
    Ich habe keine Ahnung, wie ich die objekte für GM7 verständlich auseinanderhalten soll.
    Tut mir wirklich leid, diese Frage stellen zu müssen, aber vielleicht hilft mir ja trotzdem irgendjemand.
    ;(
    Dateien
    Keine Ahnung, was ich hier tue, aber ich mach´s einfach mal!
  • Weil es mehrere Instanzen des Objekts object0 gibt. Du gibst aber nur bei Move Action object0.x und object.y an. Wenn du das machst, wird immer nur die erste Instanz angesprochen. Bei der Healthbar verhält es sich genauso.
    On teh internet u pwn noobs - but in real life noobs own you.
  • Danke schon mal für die schnelle Antwort.
    Jetzt stellt sich nur noch die Frage, wie ich die verschiedenen Instanzen anspreche?
    Mit instance_exists(objekt0) Geht das nicht (schon ausprobiert), weil die ja mehrmals da ist.
    Wie kann den Turm dazu bringen jede Instanz die in der Nähe ist abzuschießen?
    (Im der Datei im Anhang der Frage sind nur 2 objekt0 Instanzen, im eigentlichen Spiel können es aber bis zu 20 sein...)
    Keine Ahnung, was ich hier tue, aber ich mach´s einfach mal!
  • Die Funktion instance_nearest - wär ne Möglichkeit.

    Oder du arbeitest mit einem Kollisionsbereich (z.b. collision_circle), welches du um den Turm legst. Damit bekommst du die ID der aktuellen Instanz und kannst sie dann "bearbeiten".
    On teh internet u pwn noobs - but in real life noobs own you.
  • instance_nearest()

    Kannst du mir mal irgendein funktionierendes Beispiel geben?
    Ich hab keine Ahnung, wie ich dem Turm das instance_nearest(x,y,objekt) schreiben soll.
    Soll ich damit einen Text erstellen, um die ID zu sehen, oder was genau soll ich damit tun?
    Hilft das auch irgendwie bei der healthbar?
    Oder besser gefragt: Kann ich den objekten0 nicht einfach irgendwie beim erstellen eine ID zuweisen, die einmalig ist und dann auch immer erkannt wird?
    Keine Ahnung, was ich hier tue, aber ich mach´s einfach mal!
  • Nope, leider nich - die ID weist die GM-Engine zu. Ist praktisch Pointer für Arme :)

    Arbeite lieber mit collision_circle - so greift er alle Figuren an, sobald diese den Kreis betreten.

    Edit: Ich muss mal kurz weg. Mach dir nacher ein Beispiel, falls du's noch benötigst.
    On teh internet u pwn noobs - but in real life noobs own you.
  • Das problem mit der Healthbar konnte ich gerade erfolgreich beenden.
    Mein Fehler war, dass ich den code:

    GML-Quellcode

    1. {
    2. draw_sprite(sprite_index,image_index,x,y);
    3. draw_healthbar(object0.x-30,object0.y-15,objekt0.x-10,object0.y-10,h,c_white,c_red,c_green,0,0,1);
    4. }

    verwendet hab. Richtig ist:

    GML-Quellcode

    1. {
    2. draw_sprite(sprite_index,image_index,x,y);
    3. draw_healthbar(x-30,y-15,x-10,y-10,h,c_white,c_red,c_green,0,0,1);
    4. }

    Wenn mir jetzt noch irgendjemand per gml zukommen lassen könnte, wie ich das mit dem Schießen machen soll, wären
    meine Probleme (für´s erste ;) ) behoben...
    Keine Ahnung, was ich hier tue, aber ich mach´s einfach mal!
  • Information about object: object1

    Alle anderen Events löschen


    Sprite: sprite0
    Solid: false
    Visible: true
    Depth: 0
    Persistent: false
    Parent: <no parent>
    Mask: <same as sprite>

    Step Event:
    execute code:

    GML-Quellcode

    1. var myID;
    2. myID = collision_circle(x, y, 50, object0, 0, 0);
    3. if(myID) {
    4. var fire;
    5. fire = instance_create(x, y, object2);
    6. with(fire) {
    7. move_towards_point(myID.x, myID.y, object2);
    8. }
    9. }
    On teh internet u pwn noobs - but in real life noobs own you.
  • collision_circle

    Sorry, aber das tut nicht so, wie es sein soll:
    1. Gehen sofort richtig viele Schüsse los, die sollten aber zeitlich länger auseinander sein.
    2. Zielen die Schüsse solange auf das zuerst erstellte objekt, bis es zerstört ist (selbst wenn das 2. direkt vor dem Turm steht und das 1. viel weiter weg ist.
    Ist das " move_towards_point(myID.x, myID.y, object2) " so richtig ?? In der Hilfe steht was davon dass am Ende die Sp (Speed) angegeben werden soll.
    Keine Ahnung, was ich hier tue, aber ich mach´s einfach mal!
  • Achso - hmm, kann sein. Hab das nicht gestest und nur kurz die Info erstellt.

    Wenn es zuviel Schüsse sind, dann mach doch ein Limit rein. Und mit alarm kannst es ja dann steuern, wieviel Schüsse abegeben werden.
    On teh internet u pwn noobs - but in real life noobs own you.
  • PS hier die verbesserte Version:

    Create Event:
    execute code:

    GML-Quellcode

    1. fire_max_at_once = 1;
    2. fire_counter = 0;
    3. fire_rate_per_second = 0.5;


    Alarm Event for alarm 0:
    execute code:

    GML-Quellcode

    1. if(fire_counter > 0) {
    2. fire_counter -= 1;
    3. }


    Step Event:
    execute code:

    GML-Quellcode

    1. var myID;
    2. myID = collision_circle(x, y, 50, object0, 0, 0);
    3. if(myID) {
    4. if(fire_counter < fire_max_at_once ) {
    5. var fire;
    6. fire = instance_create(x, y, object2);
    7. with(fire) {
    8. move_towards_point(myID.x, myID.y, 4);
    9. }
    10. fire_counter += 1;
    11. alarm[0] = room_speed * fire_rate_per_second;
    12. }
    13. }
    Alles anzeigen


    Wobei ich mir jetzt auch nicht mehr erklären kann, warum nur das erste Objekt angeriffen wird.
    On teh internet u pwn noobs - but in real life noobs own you.
  • Habe bis jetzt mit allen Arten von ID-suchen herumgespielt, das Ergebnis ist das selbe.
    Die Kugeln gehen immer nur auf das zuerst erstellt object0 los.
    Vielleicht findet ja jemand noch was,wie man gezielt das naheliegendste objekt0 abschießen kann.
    Danke Foo für deine Hilfe!
    Keine Ahnung, was ich hier tue, aber ich mach´s einfach mal!
  • Du kannst die Sache auch andersrum angehen. Wäre in deinem Fall wahrscheinlich sogar viel einfacher. Lass die Objekte prüfen, ob sie in der Nähe des Turms sind. Wenn ja, dann erzeugen sie an dessen Koordinaten den Schuss in ihre Richtung.

    Foo hat es glaube schon erwähnt - das naheliegendste Objekt findest du hiermit raus:
    instance_nearest(x,y,obj) Returns the id of the instance of type obj nearest to (x,y). obj can be an object or the keyword all.

    Das heißt du könntest im Create-Event des Schuss-Objekts folgende Zeilen einfügen:

    GML-Quellcode

    1. target = instance_nearest(x,y,obj_enemy);
    2. direction = point_direction(x,y,target.x,target.y);


    Für "obj_enemy" muss natürlich der Name des gewünschten Objekts oder des Parents (falls es verschiedene Gegner gibt) eingesetzt werden.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.

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

  • Benutzer online 1

    1 Besucher