Visibility: Warum funktioniert es auf diese Weise, nicht aber auf die andere?

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

  • Visibility: Warum funktioniert es auf diese Weise, nicht aber auf die andere?

    Hallo Ihr Lieben,

    den gestrigen Tag war ich damit beschäftigt Bonusblöcke in mein Spiel zu integrieren. Diese sollen sich wie folgt verhalten:
    Der Bonusblock ist unsichtbar, und soll nachdem man ihn das erste mal getroffen hat sichtbar werden und bei 0HP verschwinden.

    Ich konnte das Problem lösen und alles funktioniert reibungslos, nur leider verstehe ich nicht warum es so funktioniert wie es funktioniert und nicht so wie ich es eigentlich machen wollte.

    Also die "Sichtbarkeit" war das Problem . . . das mit den zerstören klappte auf Anhieb.

    Auf diese Weise funktioniert es:

    Spoiler anzeigen

    Quellcode

    1. ///hp < 0 instance destroy && visibility
    2. if (hp <= 7)
    3. {
    4. with (obj_bonusblock)
    5. {
    6. visible = true;
    7. }
    8. }
    9. if (hp <= 0)
    10. {
    11. instance_destroy();
    12. }
    Alles anzeigen



    Auf diese Weise funktioniert es nicht: (Der Bonusblock bleibt unsichtbar, wird aber zerstört wenn er 0HP hat.

    Spoiler anzeigen

    Quellcode

    1. ///hp < 0 instance destroy && visibility
    2. if (hp <= 7)
    3. {
    4. object_set_visible(obj_bonusblock,true);
    5. }
    6. if (hp <= 0)
    7. {
    8. instance_destroy();
    9. }
    Alles anzeigen

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

  • Weil du beim zweiten Weg, alle Objekte die obj_bonusblock heißen (alle Instanze davon) sichtbar machst. Du kannst aber auch:

    GML-Quellcode

    1. object_set_visible(self,true);
    2. //oder
    3. object_set_visible(id,true);

    schreiben. Weil self dann die id der Instanz bedeutet die genau gemeint ist.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Hey Aku_Ryou,

    ich hätte die Frage/das Problem genauer formulieren sollen. Bei dem zweiten Code funktioniert es garnicht, der Block bleibt unsichtbar.
    Und was du in Line 3 stehen hast, ist ja genau das was ich auch zuerst gemacht habe, aber nicht funktioniert.
  • Die Funktion setzt die Sichtbarkeit sozusagen als Voreinstellung für alle Objekte die du angegeben hast.
    Also Als wenn du in GM vor dem Starten bei visible ein Häkchen machst.
    Kann man sich so merken dass object_* in der Funktion steht, dass das dann die Voreinstellung ist.
    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
  • Also ich habe es jetzt nochmal getestet

    So funktioniert es nicht: Der Bonusblock bleibt unsichtbar, wird aber zerstört bei 0HP.

    Spoiler anzeigen

    Quellcode

    1. if (hp <= 7)
    2. {
    3. object_set_visible(self,true);
    4. }


    Spoiler anzeigen

    Quellcode

    1. if (hp <= 7)
    2. {
    3. object_set_visible(obj_bonusblock,true);
    4. }



    @husi:
    Bedeutet das also, dass ich mit der Zeile " object_set_visible(obj_bonusblock,true); " dieses Objekt nicht gleich sichtbar machen kann, sondern für wann auch immer den Status umschalte oder sollte die Sichtbarkeit nicht auch direkt bei 7HP gegeben sein. Mal unabhängig davon ob ich nun alle Bonusblöcke im Level sichtbar machen würde, was natürlich blöd wäre. Aber da wäre ich dann später wohl auch drauf gekommen und wäre das Problem dann angegangen.

    Den wie oben schon erwähnt, sichtbar bei 7HP kann ich den Bonusblock nur mit dem Code machen:
    Spoiler anzeigen

    Quellcode

    1. if (hp <= 7)
    2. {
    3. with (obj_bonusblock)
    4. {
    5. visible = true;
    6. }
    7. //object_set_visible(self,true);
    8. }
  • Noch als Ergänzung: Visible sollte meines Erachtens nur für den Fall verwendet werden, wenn man ein Controllerobjekt oder ähnliches hat, dessen man ein Sprite zur Übersicht im Roomeditor zuweist, aber nicht will, das es grafisch im Spiel erscheint. Warum packst du nicht einfach eine Abfrage ins Drawevent

    GML-Quellcode

    1. if (hp < hpmax) {
    2. if (hp = 0) {
    3. instance_destroy();
    4. }else{
    5. draw_self();
    6. }
    7. }


    PS: self/id würde ich so nutzen "self.visible = true;" "id.visible = false;", also als Referenz nutzen.
    Das selbe funktioniert auch mit "with (self) {visible = true;}" "with(id/other/all)..."
    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 1 mal editiert, zuletzt von Rhazul ()

  • Es funktioniert zwar schon einwandfrei jetzt, aber da du dir die Mühe machst die Thematik nochmal zu verbessern, habe ich das auch nochmal getestet und joar würde soweit auch super funktionieren.

    Meinst du ich bekomme bei meinem Code noch Probleme mit der Visibility?
    Denn mein Bonusblock-System ist mittlerweile schon um einiges komplexer geworden und ich würde da ungerne noch was umschreiben.

    >>Der Bonusblock ist ein Child von meiner Wall, und für die Walls habe ich natürlich auch meinen ganzen Kollisionscode für den Spieler gemacht.
    Mit dem Bonusblock selber soll man aber nicht kollidieren, solange er noch unsichtbar ist. Also habe ich einen weiteres obj.Bonusblock erstellt das keine Kollision hat und wenn ich auf den das erste mal geschossen habe, dann wechsele ich mit instance_change diese Blöcke... und kann somit dann auch auf den Bonusblöcken laufen.

    >>>Da jetzt noch was dran ändern würde ich wirklich nur wenn das in irgendeiner Weise noch Probleme geben könnte mit der Visibility.

    Ich hänge auch mal ein Bildchen von meinem Testlevel dran. Dann könnt ihr euch ein besseres Bild machen. Naja, eigentlich auch nicht, aber egal . . .
    Bilder
    • testa.png

      282,48 kB, 2.870×1.613, 291 mal angesehen
  • Du könntest es auch alles in einem objekt machen... wenn du deine kollisions abfrage mit place_meeting machst dann heisst es ja das es mit einer maske kollidiert... heisst so viel wie du kannst das object als child lassen und schreibst im create event dazu mask_index = -1; somit hast du keine kollision und wenn dein bonus block sichtbar ist setzt du mask_index = sprite_bonusblock :)
    Wir stehen zusammen und wir fallen zusammen
  • @Eddysoulo
    das Problem daran ist ja, dass man das nicht mehr abschießen kann, dass das dann sichtbar wird.

    Man könnte es aber so machen, dass bei Berührung mit dem Spieler gecheckt wird, ob visible auf true steht. Wenn nicht, wird mask_index für die Zeit auf -1 gesetzt
    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
  • also wenn du ein par_bonusblock hast, dann packst du einfach in sein draw event meinen code und das alte mit visibility kommt ganz raus, die childs sollten dann nichts im draw event haben oder event_inherited() im drawcall aufrufen, wenn du es doch noch anderweitig nutzt. die HPZahlen können auch durch variablen ersetzt werden um dann verschiedenen childs unterschiedlich viel Leben zu geben.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel: