zerstören von aneinander gesetzten Objekten

  • GM 8

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

  • zerstören von aneinander gesetzten Objekten

    Hi Leute,...

    Ich komm grad nicht weiter und ersuche euch hier nochmal um Rat.

    Also ich bastle an einem Shooter der an " Warning Forever" angelehnt ist.
    d.h. ich habe bzw. erstelle ein " Coreobjekt " von den dann andere Platformobjekte abgehen. Diese lasse ich Random erstellen.

    GML-Quellcode

    1. case 0: if !place_meeting(x+48,y,obj_core)
    2. then instance_create(x+48,y,obj_plat); break
    3. case 1: if !place_meeting(x,y+48,obj_core)
    4. then instance_create(x,y+48,obj_plat); break
    5. case 2:if !place_meeting(x-48,y,obj_core)
    6. then instance_create(x-48,y,obj_plat); break
    7. case 3: if !place_meeting(x,y-48,obj_core)
    8. then instance_create(x,y-48,obj_plat); break
    9. else if !place_meeting(x+48,y,obj_core)
    10. then instance_create(x+48,y,obj_plat); break
    11. else if !place_meeting(x,y+48,obj_core)
    12. then instance_create(x,y+48,obj_plat); break
    13. else if !place_meeting(x-48,y,obj_core)
    14. then instance_create(x-48,y,obj_plat); break
    Alles anzeigen

    Das klappt auch soweit ganz gut.
    Nun zu meinem Problem,
    wenn jetzt z.b. 5 platformen hiereinander erstellt werden . Nennen wir sie "1,2,3,4,und 5". Und den Core "0"

    Bildlich :

    "0"12345

    Wenn jetzt der Spieler , auf z.b Platform 3 ziehlt und feuert sollte denn wenn die " HP " von Platform 3 auf 0 ist Platformen 4 und 5 mit zerstört werden. Da sie sozusagen in der Luft hängen. Also nicht mehr mit dem Core verbunden wären.

    anderes Bild

    "0"12
    345
    6
    Wenn jetzt der Spieler ,..Platformen 3,4,und 5 zerstört....sollte 6 mit zerstört werden. Da ebenfalls nicht mehr mit dem Core verbunden.

    Kennt da jemand ne Lösung für mein Problem.
    mfg, neogeo

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

  • Das hab ich jetzt nicht ganz verstanden, aber ich habe ein paar Fehler gefunden:
    hast du da noch ein switch?
    du musst noch hinter jedem case-befehl ein break machen, also ist nicht immer so, aber meistens. Machs einfach.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Ja Danke,.. habs verbessert und ja ich arbeite davor mit einem "switch".

    Aber wie gesagt darum geht ja nicht. Der Code klappt ja.

    hmm, wie kann ich das Problem noch verdeutlichen.

    Wiegesagt ,... wenn jetzt der Code mehrere platformen aneinander erstellt. Sind sie ja sozusagen miteinander verbunden.

    z.b.
    O = Core
    X = Platform

    OXXXXX

    Wenn jetzt das rote " X " zerstört wird, sollen alle anderen die sozusagen nicht mehr mit dem Core ( "O") verbunden sind mit zerstört werden.
    Das wären in diesem Beispiel alle 3 " X "(grün) rechts daneben.

    anders Beispiel


    XXOXX
    XXX
    XX

    Für dieses Beispiel , müssten die grünen " X" erst zerstört werden wenn alle roten zerstört sind. Alles was schwarz ist , ist und bleibt bestehn.

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

  • Das ist mal ein schneller (dreckiger) Code, den ich zusammengestellt habe, um dir zu zeigen, wie das Ganze aussehen könnte. Das Problem mit dem Code ist, dass er langsamer wird, je weiter weg eine Platte vom Kern entfernt ist. Das kann auch gut sein, da man so...eine Art "Zähigkeit" für die Platten hat. Mit "hp = 20;" im Step-Event funktioniert der Code noch gut, wenn man jetzt z.B. "hp = 1000;" hat, verschwinden nicht verbundene Platten jedoch erst nach ca. 30 Sekunden (bei "room_speed = 30;". Wie gesagt, es soll dir nur eine Idee geben, wie es aussehen könnte. Guck dir den Code einfach an - wenn du nur 5 Platten oder so hintereinander hast, wird der wohl ausreichend sein.
    Es ist übrigens ein Alarm im Code, damit die Objekte nicht gelöscht werden, bevor sie ihr Step-Event einmal ausgeführt werden. Stell ihn soweit runter, wie du kannst, wenn du willst. Die Logik funktioniert immerhin.
    Ich kann mir vorstellen, dass man das Ganze sehr effektiv mit ds_grid lösen könnte. Interessant.
    Spoiler anzeigen
    :event_create: Create

    GML-Quellcode

    1. hp = 0;
    2. alarm[0] = 1;
    3. alarm[1] = 60;
    4. can_die = false;


    :event_step: Step

    GML-Quellcode

    1. hp = 0;
    2. if place_meeting(x-1,y,obj_core) || place_meeting(x+1,y,obj_core) || place_meeting(x,y-1,obj_core) || place_meeting(x,y+1,obj_core)
    3. {
    4. hp = 20;
    5. }
    6. if instance_place(x-1,y,obj_platform).hp > hp{
    7. hp = instance_place(x-1,y,obj_platform).hp-1;
    8. }
    9. if instance_place(x+1,y,obj_platform).hp > hp{
    10. hp = instance_place(x+1,y,obj_platform).hp-1;
    11. }
    12. if instance_place(x,y-1,obj_platform).hp > hp{
    13. hp = instance_place(x,y-1,obj_platform).hp-1;
    14. }
    15. if instance_place(x,y+1,obj_platform).hp > hp{
    16. hp = instance_place(x,y+1,obj_platform).hp-1;
    17. }
    18. if hp < 1 && can_die == true{
    19. instance_destroy();
    20. }
    Alles anzeigen


    :event_timer: Alarm (0)

    GML-Quellcode

    1. can_die = true;

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

  • Jop, benutz ein Array, oder eine ds_list, bzw map

    Die Plattformen werden ja der Reihe nach erstellt, also kannst du sie in ein Array oder eine list eintragen, wenn jetzt eine platform beschossen wird und ihren korespondierenden array, list, .. eintrag auf 0 stellt, kann eine schleife die das array, list, .. durchläuft dies erkennen und alle folgenden einträge löschen bzw die zerstörung der folgenden Plattformen veranlassen.
    Du bräuchtest eigtl nicht mal unbedingt objekte dafür, aber das geht vielleicht auch wieder einen schritt zu weit.

    Aber mit einem Array oder einer list ist dir auf jeden Fall geholfen, da brauchst du keine Timer oder iwelche komplizierten Abfragen.

    GML-Quellcode

    1. for (i = 0 ; i < arraylänge ; ++i)
    2. {
    3. //wenn wert i-1 == 0 dann mein wert auch 0
    4. //zerstöre platform mit kontroll_id i
    5. }

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Hi ,..nochmal.
    Ok,... ich muß zugeben das mir der letzte Beitrag nix sagt. Klar, hab ich was schon über Array gehört. Aber selber noch nie angewandt bzw. benutzt. So fortgeschitten bin ich denn doch nicht.
    Aber ich bin einer der erstmal viel selber probiert , bevor ich euch und andere hier belästige.

    Falls jemand doch die Mühe machen könnte mir das mit dem Array anhand eines Beispiels zu erklären. Wäre das echt Klasse!

    Ich hab dafür mal meinen Code ( Beispiel) mit angehängt.
    Wiegesagt,...
    Ein Core ( obj_torso ) wird erschaffen ,.. der wiederrum erschafft viele in verschiedene Richtungen abgehende Platformen ( obj_plat). Die sind letztlich mit dem torso verbunden.
    Nun feuert der Spieler auf eine platform die nicht unmittelbar am torso hängt.
    Wenn nun diese platform zerstört worden ist , sollen die platformen die nicht mehr mit dem torso verbunden sind mit zerstört werden.
    ( Im Beispiel ( Anhang) wären das jeweils die obersten 2 platformen)
    Ich hoffe ich hab mich halbwegs verständlich ausgedrückt.

    Beispiel
    mediafire.com/download/a4jbigldrcrwrdv/testplatform.gm81
  • arrays sind einfach, die erkläre ich jetzt mal:
    man könnte theoretisch das machen

    GML-Quellcode

    1. variable1="Hallo"
    2. variable2="BLa"
    3. variable3="BliblaBlub"


    einfacher wäre es aber, wenn du das so machst

    GML-Quellcode

    1. variable[0]="Hallo"
    2. variable[1]="Bla"
    3. variable[2]="BliblaBlub"


    der Vorteil, man braucht nur eine Variable und kann auch anstatt die Zahl eine Variable mit einer Zahl hinein tun:

    GML-Quellcode

    1. speichern=variable[irandom(2)]

    da wird dann eins dieser Worte in die Variable speicher eingefügt.
    Du kannst aber auch eine schleife nehmen und dann jeden einzelnen Array irgendwas abfragen.
    Der Nachteil, es geht nur bis 32000, aber ist schon genug

    was man beachten muss:
    die Arrays fangen mit 0 an.

    Ich hoffe du kannst es so verstehen :D
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • neogeo schrieb:

    Bei diesem Code bekomme ich leider eine Fehlermeldung.
    " Unkown Variable "hp" , in Line 8
    sagt der mir.


    das ist doch einfach zu lösen, man schaut erst dort wo der fehler gefunden wurde:

    GML-Quellcode

    1. if instance_place(x-1,y,obj_platform).hp > hp{

    das währe da, dann schaut man was für ein fehler das ist:
    "Unknown Variable""hp"=Das object hat also anscheinend keine hp variable, oder es existiert nicht

    um das zu lösen kontrollier einfach:
    1. die Platformen heißen wirklich obj_platform
    2. das obj_platform ist zum zeitpunkt der codeausführung wirklich im raum
    3. das obj_platform braucht eine "hp" variable

    echt nicht so schwer oder? :D
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Hi,... erstmal Danke für die Mühe hier mit mir und für das Beispiel mit dem Array. Gutes und verständliches Beispiel.

    Doch lyncht mich bitte nicht wenn ich sage der Code funkt immer noch nicht.
    Entweder bin ich mit totaler Blödheit geschlagen ,....was durchaus manchmal vorkommen mag.
    Ich hab den Code in ein Beispiel angehängt,...
    wie gesagt , der Fehler kommt immer und immer wieder.
    Hab schon ne lange weile mit der Fehler suche investiert. Doch ich kann keinen finden.

    Gruß, Neogeo
    mediafire.com/download/4mqo30vz1bb3e5y/testplatform2.gm81
  • ja sry, und Danke. Eigl. weiß ich ja das "choose" ein Befehl ist. Benutze ihn auch. Sagen wir mal, ich war etwas unaufmerksam bei der Vergabe der Namen für die Variablen im Beispiel.
    Aber wiegesagt Danke für den Hinweis.

    Das mit dem Code in einem Block und dann nicht in diesem Block,....schnall ich noch nicht ganz. Und dann soll alles ins Create event???! Weil oben war es noch... create, step und dann alarm event.
    Ich will aufkeinenfall nerven,....und hab auch schon eine etwas andere , unschönere Lösung selber erstellt. (verzichte zwar auf die Problematik) Aber naja,..
    Bin halt noch nicht soweit um zuverstehen wie dein Code nun richtig funktioniert.
    Falls du doch noch Nerv und Muse besitzt , mir hier ein Exsample deines Codes in Action zu präsentieren. Wäre das echt N1.