instance_id verstehen lernen

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

  • instance_id verstehen lernen

    Hallo liebes Forum!

    Nun, da ich durch das humble bundle glücklicher Besitzer einer Pro-Edition vom Game Maker geworden bin, hab ich direkt ein paar Fragen.

    Ich glaube zunächst mal, daß mich meine jahrelange QBasic-Erfahrung hier mehr hindert als das sie mir nützt (bin schon etwas älter :D )

    Ich versuche momentan ein Mario-Clone zu erstellen (zum lernen) - was wohl viele am Anfang machen. Zunächst klappte alles ganz wunderbar aber jetzt kommen mehr und mehr Probleme auf!
    Ich bin grad dabei, zersörbare Steine zu machen, wie man sie aus Mario so kennt. Man springt von unten gegen und dann "plopp" geht der Stein kaputt und ggf. wird ein Effekt ausgelöst.

    Ich scheiter jetzt schon daran, das ich das mit den instance-id´s nicht checke! Ich habe, sagen wir mal 50 solche Blöcke in einem Level und die haben alle eine ID! Außerdem haben ich 20 Level, was dann zusammen ca 1000 Blöcke pro Spiel macht - soweit so gut!
    Wie und wo lese ich diese aus und wo deviniere ich dann für jeden einzelnen, was er machen soll. Ich vermute mal ein Array ist hier die Lösung. Aber ich scheiter schon an der Kollisonsabfrage beim "von unten gegenspringen". Ich will ja einen soliden Block, der von oben begehbar ist. Allerdings muss er von unten zerstörbar sein. Nehme ich also solid-Blöcke, bekomme ich keine Kollisionsabfrage hin (da hab ich wohl einen meiner vielen Denkfehler). Mach ich ihn nicht sollid klappt zwar die Abfrage, und er spielt bei Berührung z.B. einen Block-Sound. Aber ich rutsche dann z.b. von oben langsam durch den Block nach unten wenn ich drauf springe (habs dann mit vspeed = 0 bei berührung versucht - klappt natürlich nicht wie gewünscht)

    Vielleicht kann mir einer mal ganz easy erklären wie ich sowas angehen kann?

    Vielen lieben Dank ihr Lieben :thumbsup:

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von sirhobbes ()

  • Willkommen :)

    Du brauchst kein Array um die Kollsionen oÄ zu überprüfen, funktionen die dir die instance-id zurückgeben sind zB collision_ funktionen.

    GML-Quellcode

    1. if vspeed < 0 //du bewegst dich nach oben weil du zB springst
    2. {
    3. collID = collsion_line(x,y,x,y+vspeed,obj_block,0,1);//speichere die isntanceID vom Block den du berührst in die variable, quasi ein linetrace/raytrace/cast
    4. if collID != noone//wenn da was ist
    5. {
    6. with(collID)
    7. {
    8. instance_destroy();//zerstöre den Block
    9. }
    10. }


    damit kannst du Blöcke von unten zerstören und es stört deinen ursprünglichen bewegungscode nicht.

    EDIT: hierbei ist es auch egal ob der Block auf solid gestellt ist oder nicht.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Auch von mir ein herzliches Willkommen :)
    @Aku_Ryou
    collision_line nicht collsion_line :P

    Ich schätze @sirhobbes möchte angeben, welcher Block was spawnen soll.
    Ein Array schätze ich mal, wäre nicht so schlecht:

    GML-Quellcode

    1. ​enum item{
    2. coin,
    3. levelup
    4. }
    5. item[0] = item.coin;
    6. item[1] = item.levelup;
    7. //...
    8. //später beim erstellen
    9. if(id == object_index.id)
    10. global.block_num = myitem = 0;
    11. else
    12. myitem = ++global.block_num;
    Alles anzeigen

    Mit einem enum werden der einfachheitshalber die Items "erstellt".
    Dann im Array überall vergeben. Dieses Array sollte am besten nur einmal bestehen, da sonst unnötig viel Speicher verbraucht wird. Mach es zB. einfach global, sodass die anderen Blöcke dies nur überschreiben.
    Der letzte Part ist eigentlich ganz cool:
    Erst fragen wir ab, ob wir der erste Block sind, der sein Create aufruft, indem wir checken, ob die eigene id gleich die von dem ersten ist, da zB. bei blockid = obj_block.id; die id von ersten obj_block genommen wird. object_index hat im Objekt obj_block den Wert obj_block.
    Wenn das so ist, dann setze die globale Variable block_num & myitem auf 0. Wenn der Block nicht der erste ist, wird myitem auf global.block_num+1 gesetzt, wobei global.block_num auch +1 gerechnet wird.

    Hoffe das war einigermaßen verständlich ^^
    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
  • @Husi012 ich verlass mich auf dich, meine typos auszubessern ;)

    Für Items oder welcher Block zerstörbar ist, reicht es aber vollkommen im Room Editor einen Rechtsklick auf den Block zu äh tun und dann im creation code:

    GML-Quellcode

    1. isDestroyable = true;
    2. item = 0;//oder obj_coin oder eine andere variable die dann mit einem enum verknüpft wird

    zu setzen.
    Mit den variablen kannst du dann arbeiten wenn du dagegen springst. Dann brauchst du kein riesen array (je nach levelgröße) und hast die volle kontrolle über den room editor welcher block was kann.
    Im draw event kannst du dann zB die Blöcke die zerstörbar sind anderes drawen lassen als die die normal geblieben sind.

    GML-Quellcode

    1. ///Draw
    2. if isDestroyable == true
    3. {
    4. draw_sprite(spr_block_brick,0,x,y);
    5. if item > 0
    6. {
    7. draw_sprite(spr_block_glimmer,0,x,y);
    8. }
    9. }
    10. else
    11. {
    12. draw_sprite(spr_block_normal,0,x,y);
    13. }
    Alles anzeigen

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Hallo again. (und danke an das freundliche Hallo :thumbsup: )

    Leider konnte ich mein Problem noch nicht gänzlich lösen. Ich habe da wohl noch ein paar Verständnis Probleme des genauen Ablaufs im Game Maker. Ich habe jetzt zur Abfrage, gegen welchen Block ich springe dieses Script aus einem anderen Thread umgebastelt und das läuft soweit auch gut!

    Quellcode

    1. GML-Quellcode///kollision Event parent
    2. scr_collision(other)
    3. ///scr_collision
    4. with(argument0)
    5. if other.vspeed < 0
    6. {
    7. other.vspeed = 0
    8. audio_play_sound(snd_block_hit,0,0)
    9. instance_destroy()
    10. }
    Alles anzeigen


    Wenn ich jetzt also von unten gegenspringe, löst sich der jeweilige Block wie gewünscht auf.
    Wie schaffe ich es jetzt, das er den Block als soliden Block behandelt, wenn ich NICHT von unten gegenspringe?!
    Mit einem

    Quellcode

    1. else if other.vspeed >= 0
    2. {
    3. other.vspeed = 0
    4. }


    rutscht der player Pixel für Pixel nach unten durch den Block. Seitlich passiert das gleiche, sobald ich seitlich in ihn hineinspringe.

    Mir ist noch nicht ganz klar, wie ich das jetzt hinbekomme.

    Ach ja - und noch eine Verständnisfrage:

    Bei meinem Script "scr_collision(other)" wird die ID des getroffenen Objects übergeben, richtig?

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