Schuss id will nicht zerstört werden

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

  • Schuss id will nicht zerstört werden

    Hallo liebe GM Community,
    ich habe erneut ein Problem, und zwar habe ich eine Kanone die zwei unterschiedliche Schüsse abgibt und diese Schüsse sollen nach einer gewissen Distanz bzw. Zeit zerstört und durch ein anderes sprite ersetzt werden.
    Der nachfolgende Code soll bewirken das die Schüsse an ihrer Zielposition einschlagen und nicht über die ganze Map fliegen.

    Objekt Kanone:
    Step event

    GML-Quellcode

    1. image_speed = 0
    2. if mouse_check_button(mb_left)
    3. {
    4. image_speed = 0.5;
    5. if image_index = 1
    6. {
    7. alarm[0] = 1
    8. }
    9. }
    10. else
    11. if !image_index = 0
    12. {
    13. image_speed = 0.5
    14. if image_index = 4
    15. {
    16. alarm[1] = 1
    17. }
    18. }
    Alles anzeigen

    Die Alarme habe ich, wie ihr seht auf die Bilder der der Kanone angepasst. Das funktioniert auch super. :)

    Alarm 0:

    GML-Quellcode

    1. id_schuss = instance_create(x,y,obj_schuss1)
    2. id_schuss.direction = direction
    3. id_schuss.speed = 5
    4. var v, t, s;
    5. v = 5
    6. s = point_distance(x,y,obj_ziel.x,obj_ziel.y)
    7. t = s/v
    8. alarm[2] = t
    Alles anzeigen


    Alarm 1:

    GML-Quellcode

    1. id_schuss2 = instance_create(x,y,obj_schuss2)
    2. id_schuss2.direction = direction
    3. id_schuss2.speed = 5
    4. var v, t, s;
    5. v = 5
    6. s = point_distance(x,y,obj_ziel.x,obj_ziel.y)
    7. t = s/v
    8. alarm[2] = t
    Alles anzeigen

    Und die Berechnung der Entfernung vom Abschuss der Kanone bis zum Ziel (der Einschlag für den Schuss, dort wo er zerstört werden soll) habe ich mit der einfachen Formel t = s/v (Zeit = Weg bzw. distanz / Projektil Geschwindigkeit ) errechnet.

    Alarm 2:

    GML-Quellcode

    1. with(id_schuss)instance_destroy()
    2. with(id_schuss2)instance_destroy()


    Jetzt komme ich mal zum Problem:
    Wenn ich die linke Maustaste EINMAL drücke werden die zwei Schüsse abgefeuert und am Zielort zerstört. So wie es sein soll.
    Aber wenn ich die linke Maustaste FESTHALTE und 7-8 salven abgefeuert wurden, werden nur die letzten beiden Schuss Instanzen zerstöt und die anderen fliegen einfach weiter. ;(
    Könntet ihr mir sagen wie ich alle instanzen an ihren einzelnen Zielkoordinaten zerstören kann?

    Ihr werdet mir jetzt bestimmt vorhalten wie unsauber das geschrieben ist und das das alles viel leichter geht, aber es soll erstmal funktionieren. :D

    Danke schonmal im voraus.
    Für jene, die ständig das Scheitern fürchten, sind Erfolge auf ewig unerreichbar.
  • Ist ja klar, du hast nur 2 Variablen, desshalb werden nur die letzten 2 Schuss gespeichert.

    Ich würde da so rangehen :

    GML-Quellcode

    1. //CREATE DER KANONE
    2. SchussListe = ds_list_create();


    GML-Quellcode

    1. //DESTROY EVENT DER KANONE
    2. ds_list_destroy(SchussListe);


    GML-Quellcode

    1. //ALARM 2
    2. while (!ds_list_empty(SchussListe)) {
    3. with (ds_list_find_index(SchussListe,0)) {
    4. instance-destroy();
    5. }
    6. ds_list_delete(SchussListe,0);
    7. }


    ALLERDINGS, sollten deine Profildaten aktuell sein und du tatsächlich aus mir unerklärlichen Gründen noch GM 8.1 Lite benutzen, dann kannst du soweit ich mich entsinne keine Dateistrukturen benutzen.
    DIE LÖSUNG : Gehe auf YoyoGames und lade dir die KOSTENLOSE :thumbup: Standard Version von Studio runter. Da hast du viel mehr Möglichkeiten und die Umstellung ist keine Große. Jediglich ein paar alte Funktionen tun es nicht mehr, da wird dir der compiler aber bescheid sagen und dann kannst du jeder Zeit fragen wenn du nicht weißt wie du die Fehler beheben sollst.

    Mfg Rhazul
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Ich dachte durch die Variablen wird jeder Instance die erstellt wird eine eigene Id zugewiesen und das diese auch nacheinander abgearbeitet werden? Aber das zählt bestimmt nicht für Funktionen nicht wahr. :D
    Ach mist fällt mir grad selbst auf. Ich dachte das instance_destroy() wie eine Instanz behandelt wird und somit jede Instanz einzeln berechnet und nacheinander zerstört. Aber wenn es kein Objekt gibt, gibt es auch keine Instanz. -_-
    Doch ich glaube man kann Dateistrukturen nutzen.
    Apropo Dateistrukturen, ich habe mich noch nie mit denen beschäftigt und weiß nicht wie man damit umgeht. Kannst du mir die kurz erläutern an einen Beispiel?

    Ja ich nutze noch die Lite version von GM 8.1 warum...weiß ich selber nicht. Ich hab es mal mit Studio ganz zum anfang probiert. Aber da gab es bei mir ein paar Probleme deswegen bin ich wieder umgestiegen. Und jetzt besteht glaub ich eine Acc Pflicht um Studio zu starten oder?
    Für jene, die ständig das Scheitern fürchten, sind Erfolge auf ewig unerreichbar.
  • Das Problem ist, dass die 2 variablen lokal in deiner Kanone sind, wird geschossen während noch 2 schuss existieren wird eine variable überschrieben und der zugriff auf ein projektil geht verloren. mit meinem Ansatz brauchst du keine unterschiedlichen Variablen und nur einen alarm zur erstellung beim schießen

    GML-Quellcode

    1. var _schuss;
    2. _schuss = instance_create (x, y,obj_Schuss);
    3. with (_schuss) {
    4. direction = other.direction;
    5. speed = 5;
    6. }
    7. ds_list_add (SchussListe,_schuss);
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:

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

  • BOOAH, regt mich GM:S auf. So viele Kleinigkeiten die mir den spaß am Programmieren versauen. Nicht nur das der langsam ist das Spiel zu initalisieren nein er lässt mich nicht mal Speicherdateien umbennen und packt einfach eine neue Datei mit rein. Nur weil ich ein wenig mit dem Code rumgebastelt habe ist mir viel verloren gegangen. -_- Ich muss mich zwar dran gewöhnen aber dennoch stinkt GM:S hart nach Maggie.

    Nun zum eigentlichen Problem.
    Ich brauche beide schuss Objekte. Da diese je ihre eigene Richtung haben und deswegen einzeln berechnet werden sollen.
    Desweiteren als ich rum probiert habe und nur ein schuss immer abfeuern ließ. Kam der Fehler das "Data structure with index does not exist." und zwar für "ds_list_delete(SchussListe,0);" bevor das Spiel überhaupt gestartet ist. Sonst gab es noch sollche Probleme mit dem while Statement (damit habe ich generell schlechte Erfahrung und versuche dieses Statements zu umgehen genau so wie mit dem Do Statement) das sich in einer Endlosschleife verirrte.
    Zudem war noch das die schuss objekte erstellt wurde sind, aber nicht zerstört wurden, sondern nur die letzten beiden Instanzen wurden Zerstört und das führte auch wieder zum "FATAL ERROR".

    Der GM hat mich heute genug geärgert. Ich verschieb das alles auf den morgigen Tag.
    Für jene, die ständig das Scheitern fürchten, sind Erfolge auf ewig unerreichbar.
  • Sag mal, warum setzt du nicht einfach den alarm im Schussobjekt und wenn der ausgelöst wird, dann lässt du die Kugel stoppen udn das sprite zeichnen und dann die Kugel zerstören?

    GML-Quellcode

    1. id_schuss.alarm[0] = t;

    keine listen, keine stacks, jeder schuss kann das selber handlen.

    das mit den while und do until ist nur eine Frage der Erfahrung damit sich die nciht in eine Endlosschleife wandeln, sind aber sehr nützlich.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Ehrlichgesagt weiß ich nicht, was für ein Problem du hast. Mein Hauptprojekt mit 120+ scripten, mehreren shadern und unzähligen objekten wird auf meinem 7 jahre alten laptop innerhalb von 5-10 sekunden gebuildet wenn man nicht vorher den asset compiler cache leert. Zudem ist es logisch das GM:S dein Projekt nicht mehr findet wenn du einfach ausserhalb der IDE den Namen umänderst da dann der Pfad nicht mehr übereinstimmt. Zu dem "Data Structure not found" kann ich nur sagen, dass du es falsch verwendet hast und nicht so wie ich oben beschrieben habe. Denn hättest du es ins destroy event der kanone gepackt kann der fehler unmöglich schon beim starten auftauchen. Sorry wenn das jetzt was schnippig rüber kam, aber du kannst auch nicht über das Programm herziehen wenn die Fehler eindeutig auf deiner Seite liegen.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Erstmal vielen Dank an Aku_Ryou,
    Ich wusste nicht das man damit auf das Objekt zugreifen kann. Ich dachte es würde einfach lokal bleiben da es ja weder ein script ist, noch eine globale Variable.

    Nun zu Rhazul.
    Das mit dem "GM:S ist zu langsam" meinte ich nicht so. Wenn man bei GM 8.1 auf Play gedrückt hat ging es gleich los, und bei Studio steht ja unten bei compile die ganzen Lade vorgänge die er durchgeht und da ich immer viel rum probiere und dieser Play button mein bester freund ist, hat mich das schon genervt diese 2 sekunden jedesmal zu warten.(eigentlich bin ich kein ungeduldiger Mensch ^^)
    Das mit dem Umbenennen hab ich definitiv richtig gemacht(hab ich bei GM 8.1 auch immer gemacht). Unter File> Save as und dann die neue Datei erstellt die ich anders genannt habe und dann die alte gelöscht.
    Das mit der "Data structure with index does not exist." kann sein das ich das falsch gemacht habe. Da ich vorher noch nie damit gearbeitet habe.
    Btw. Das war bei dem "ds_list_delete(SchussListe,0);" und wie oben beschrieben war das bei dir im Alarm 2 drin. Im Destroy event der Kanone ist "ds_list_destroy(SchussListe);" :whistling:
    Ich habe das Programm nie daran schuld gemacht das der Code bei mir nicht Funktioniert hat. Tut mir leid wenn es sich so angehört hat. :(
    Dennoch danke das du dir die Zeit genommen hast das zu schreiben und mir zu erklären. :)

    Noch was ist es jetzt nochmal das wenn das Spiel startet, das als erstes 2 Schüsse abgefeuert werden? ist bei GM 8.1 nie der Fall gewesen. :huh:
    Für jene, die ständig das Scheitern fürchten, sind Erfolge auf ewig unerreichbar.
  • Ich denke, du hast das etwas falsch verstanden. das ds_list_delete(SchussListe,0); (wie alle anderen ds_list Sachen) sollten wenn dann in die Kanone. Wenn man das natürlich ins destroy eines Projektils packt ist klar das es einen Fehler gibt, denn man kann ja keine Dateistruktur löschen die nicht existiert (zumindest existiert sie halt nicht im Projektil, sondern in der Kanone). Der Fehler kann eigentlich nur kommen, wenn man die Dateistruktur erst garnicht erstellt hat oder sie schon gelöscht wurde.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel: