Objekte mit lock stapeln

  • GM 8

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

  • Objekte mit lock stapeln

    Heyho!
    Ich mache gerade einen Level Editor, der so ähnlich ist wie der von GM, blos besser.
    Ich bin gerade dabei auch diese lock knöpfe zu machen (die mit dem Schloss).
    Das Problem (im Editor):
    Ich baue einen Block ohne lock, dann drücke ich den Lock Knopf und das Objekt wird lock=1, dann baue ich ein anderes object auf das alte und es werden anstatt 1 meherere auf das andere gebaut. Man baut Objekte in dem man die linke Maustaste gedrückt hält.
    Wenn man den Lock knopf drückt werden alle objekte lock=1.
    Mein Code:
    :event_step:-event

    GML-Quellcode

    1. x=mouse_x
    2. y=mouse_y
    3. if mouse_check_button(mb_left)
    4. {
    5. with collision_point(x,y,all,0,0)
    6. {
    7. if variable_local_exists('lock')
    8. {
    9. if lock=0{instance_destroy()}
    10. }
    11. }
    12. with instance_create(x,y,obj_Block)
    13. {
    14. move_snap(16,16)
    15. }
    16. }
    Alles anzeigen

    Wenn der obj_Block gebaut wird wird bei ihm lock=0 gesetzt
    Ich hoffe ihr könnt mir helfen.
    Twitter: @BytingGames
  • Wenn ich es mir so wie den GM Editor vorstellen muss wo von ich jetzt mal aus gehe.
    Müstest du evtl ein System einbauen das überrpüft ob mehrere objekte unter dem Mausklick sind.
    Sie dann auf listen und nur das Gewünschte löschen oder verändern.

    Oder du läst erst garnicht zu das man übereinander bauen kann.
    Fals es sich aber zb um Landschaft und objekte auf einem Punkt handelt müstest du es in eben Unterteilen. Wie zb TIleset und Objekte. ebenfalls genau wie im GM
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Es funktioniert immer noch nicht ;(
    Ich hab schon mehrere Schen ausprobiert, kann es sein das der Game Maker ein paar Probleme mit Objekten die übereinandergestapelt sind hat? Gibt es ueberhaupt eine Möglichkeit das Problem zu lösen?
    Nimmt er bei with collision_point(x,y,all,0,0) wenn Objekte uebereinander gestapelt sind nur das Oberste???
    Wie soll ich das Coden? Ich kapiers nicht, bitte helft mir?!?
    Twitter: @BytingGames
  • Also ich würde mal behaupten er geht dann durch die komplette liste aller Instanzen an dieser Stelle.

    Wenn du nur das oberste haben willst, das müsste ja dann auch immer das Objekt mit der höchsten ID an dieser stelle sein, dann merk dir doch einfach die letzte ID, und verarbeite es ausserhalb des with.

    GML-Quellcode

    1. merke_id = -1;
    2. with (collision_point(x,y,all,0,0)
    3. {
    4. merke_id = id;
    5. }
    6. if (merke_id > -1)
    7. {
    8. // jetzt mach irgendwas mit merke_id
    9. }
  • so hab ichs schon versucht (oder so ähnlich) aber das klappt auch nicht.
    Ich hab jetzt mal eine Beispieldatei gemacht und Hochgeladen wäre nett wenn ihr die euch runterladet und sie dan so macht wie ich es haben will. Für die dies nicht verstanden haben:
    Ich will das wenn ich einen LockKnopf drücke alle Objekte die schon gebaut wurden gesichert werden (lock=1)und wenn man dann ein neuen Block auf einen abgesicherten bauen will kann man nur einen bauen bis man wieder Lock gedrückt hat dann kann man noch einen drauf bauen.
    Datei ist im Anhang
    Dateien
    • EditorBsp.zip

      (11,6 kB, 420 mal heruntergeladen, zuletzt: )
    Twitter: @BytingGames
  • Hi iks_deh,
    ich habe mir dein Beispielprogramm angeschaut.

    Du hast folgendes gemacht:
    Dein Objekt hat eine Variable Lock die mit 0 initialisiert wird. So weit so gut.
    Dein Schloss-Symbol hat ebenfalls eine (eigene) Variable lock bekommen, und jetzt schaltest du immer beim anklicken des Schlosses die lock-Variable, aber nur die des Schlosses von 0 auf 1 und umgekehrt.
    Das interessiert die lock Variable deines Objektes aber überhaupt nicht, die bleibt immer und ewig 0.

    Folgendes ist zu tun:
    Nur dein Objekt soll eine Lock variable haben. Die mit 0 initialisiert wird.
    Alle anderen create-events kannst du vorerst löschen.
    In deinem Schloss objekt musst du beim anklicken des Symbols nur durch alle Objekte durchgehen und alle locks auf 1 setzen:

    GML-Quellcode

    1. with (obj_Objekt)
    2. {
    3. lock=1;
    4. }

    Da "with" durch alle instanzen geht und als "self" bekannt macht reicht es hier nur lock abzufragen.
    Man könnte auch id.lock = 1; machen, da die ID durch die "with" Anweisung immer auf die aktuelle ID setzt.
    Nach der "with" Anweisung zeigt id wieder auf die Instanz deines Schlosses.

    ok, anschliessend im Step-Event deiner Maus:
    Hier solltest du nachdem du die Kollision mit einem Objekt festgestellt hast dessen Lock-Variable auf 0 prüfen.
    Du willst ja nur Objekte löschen deren lock 0 ist.

    GML-Quellcode

    1. if mouse_check_button(mb_right)
    2. {
    3. with collision_point(x,y,obj_Objekt,0,0)
    4. {
    5. if (id.lock == 0)
    6. {
    7. instance_destroy()
    8. }
    9. }
    10. }


    Dann funktioniert fast alles. Allerdings kannst du kein weiteres objekt darüber Zeichnen, da du ja die Kollision mit jedem obj_Objekt verbietest:

    GML-Quellcode

    1. if mouse_check_button(mb_left) and !collision_point(x,y,obj_Objekt,0,0) and !collision_point(x,y,obj_Lock,0,0)
    2. {
    3. with instance_create(x,y,obj_Objekt)
    4. {
    5. move_snap(16,16)
    6. }
    7. }

    Das zu beheben ist etwas komplizierter.
    Hier muss man die collision nur dann verbieten wenn das objekt einen lock = 0 hat.
    Das funktioniert aus irgendeinem Grund bei mir grad nicht.

    Ich habe dem Objekt noch ein zweites Sprite spendiert, dass anzeigt dass das Objekt gelockt ist.

    Ich würde ja mein Zeug anhängen aber mein GM8.1 Projekt lässt sich von deinem GM8 wahrscheinlich nicht öffnen.

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

  • So, jetzt hab ichs ;)
    Aber irgendwas ist da noch merkwürdig mit der Kollisionserkennung. Das geht garantiert viel einfacher!
    Hab jetzt aber keine Zeit mehr, Sportschau läuft^^

    GML-Quellcode

    1. x=mouse_x
    2. y=mouse_y
    3. move_snap(16,16)
    4. var b_allow_build
    5. //Bauen
    6. if mouse_check_button(mb_left) and !collision_point(x,y,obj_Lock,0,0)
    7. {
    8. b_allow_build = true;
    9. // durch alle objekte durchgehen
    10. with obj_Objekt
    11. {
    12. // kollision dieser instanz mit der maus?
    13. if(id == collision_point(mouse_x,mouse_y,id,0,0))
    14. {
    15. // Ist das Objekt schon gelockt?
    16. if (lock == 0)
    17. {
    18. // Objekt ist nicht gelockt, also darf hier nicht noch mal gebaut werden
    19. b_allow_build = false;
    20. }
    21. }
    22. }
    23. if (b_allow_build == true)
    24. {
    25. with instance_create(x,y,obj_Objekt)
    26. {
    27. move_snap(16,16)
    28. }
    29. }
    30. }
    31. //L�schen
    32. if mouse_check_button(mb_right)
    33. {
    34. with obj_Objekt
    35. {
    36. if(id == collision_point(mouse_x,mouse_y,id,0,0))
    37. {
    38. // Ist das Objekt schon gelockt?
    39. if (lock == 0)
    40. {
    41. // Objekt ist nicht gelockt, also löschen
    42. instance_destroy()
    43. }
    44. }
    45. }
    46. }
    Alles anzeigen

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

  • Also das manchmal 2 oder mehrere Objekte übereinander gebaut werden passiert dann wenn die Muas genau zwischen zwei Objekten ist, warscheinlich funktioniert dort irgendwie die Kollision nicht naja ich habs mal hoch geladen wer weiss wie man das ändert bitte sagen oder die neue Datei schicken.
    Achja und noch ein sehr großes Dankeschön @sledge hammer, hat mir echt geholfen :thumbsup:
    Dateien
    • EditorBsp.zip

      (11,73 kB, 388 mal heruntergeladen, zuletzt: )
    Twitter: @BytingGames
  • Bei mir funktioniert folgendes:
    im "with" werden ja x und y auf das jeweilige Objekt gemappt. Und "other" wird die Instanz deines MausObjekts.

    GML-Quellcode

    1. x=mouse_x
    2. y=mouse_y
    3. move_snap(16,16)
    4. var b_allow_build
    5. //Bauen
    6. if mouse_check_button(mb_left) and !collision_point(x,y,obj_Lock,0,0)
    7. {
    8. b_allow_build = true;
    9. // durch alle objekte mit kollision durchgehen
    10. with obj_Objekt
    11. {
    12. if(collision_point(other.x,other.y,id,0,0) > -1)
    13. {
    14. // Ist das Objekt schon gelockt?
    15. if (lock == 0)
    16. {
    17. // Objekt ist nicht gelockt, also darf hier nicht noch mal gebaut werden
    18. b_allow_build = false;
    19. }
    20. }
    21. }
    22. if (b_allow_build == true)
    23. {
    24. instance_create(x,y,obj_Objekt)
    25. }
    26. }
    27. //Löschen
    28. if mouse_check_button(mb_right)
    29. {
    30. with obj_Objekt
    31. {
    32. if(collision_point(other.x,other.y,id,0,0) > -1)
    33. {
    34. // Ist das Objekt schon gelockt?
    35. if (lock == 0)
    36. {
    37. // Objekt ist nicht gelockt, also darf hier nicht noch mal gebaut werden
    38. instance_destroy()
    39. }
    40. }
    41. }
    42. }
    Alles anzeigen
  • kannst du doch. schau dir mal die variable depth an:

    Hilfe schrieb:

    depth Normalerweise werden Bilder dargestellt in der Reihenfolge, wie die Instanzen erstellt werden. Du kannst dies ändern, indem du eine "image depth" (Zeichenebene) festlegst. Voreingestellt ist 0, sofern du keinen anderen Wert in den "object properties" angegeben hast. Je höher der Wert, desto weiter ist die Instanz "entfernt". (Du kannst auch negative Werte einsetzen.) Instanzen mit höherer "depth" werden hinter Instanzen mit niedrigerer "depth" dargestellt. Durch festlegen der "depth" wird sichergestellt, dass die Instanzen in der von dir gewünschten Anordnung dargestellt werden (z.B. Ein Flugzeug vor den Wolken). Hintergrundinstanzen sollten eine hohe (positive) "depth" haben und Vordergrundinstanzen eine niedrige (negative) "depth"
  • Was genau möchtest du?
    Möchtest du dass die zuerst gezeichneten immer in Ebene 0 landen? Und jedes darauffolgende jeweils eine Ebene höher?
    Oder möchtest du für jedes Objekt die Höhe angeben können?

    Bei ersterem loops du im Mouseklick event erstmal durch alle kollisionsobjekte und merkst dir die Anzahl.
    Das neue Objekt bekommt dann als Ebene die Anzahl der Objekte.

    Für letzteres müsstest du am besten einen Ebene Hoch bzw Ebene Runter Button machen (oder Mausrad rauf und runter).
    Dann kannst du beim klicken direkt die aktuelle Ebene anhängen.
    Allerdings musst du dir über die Darstellung der Ebenen darüber und darunter Gedanken machen.
    Sollen die überhaupt gezeichnet werden, oder nur die aktuelle Ebene?
  • Sledge Hammer schrieb:


    Was genau möchtest du?
    Möchtest du dass die zuerst gezeichneten immer in Ebene 0 landen? Und jedes darauffolgende jeweils eine Ebene höher?
    Oder möchtest du für jedes Objekt die Höhe angeben können?

    Bei ersterem loops du im Mouseklick event erstmal durch alle kollisionsobjekte und merkst dir die Anzahl.
    Das neue Objekt bekommt dann als Ebene die Anzahl der Objekte.

    Für letzteres müsstest du am besten einen Ebene Hoch bzw Ebene Runter Button machen (oder Mausrad rauf und runter).
    Dann kannst du beim klicken direkt die aktuelle Ebene anhängen.
    Allerdings musst du dir über die Darstellung der Ebenen darüber und darunter Gedanken machen.
    Sollen die überhaupt gezeichnet werden, oder nur die aktuelle Ebene?

    Der lertzte Absatz, so könnte man das machen aber das muss dann iks deh entscheiden ;) ob er es überhaupt und so machen will....

    Edit: Achso jetzt weis ich was ihr meint. Das mit den depths das kenne ich aber ich meine es halt nur damit man mehrer Objekte aufeinander platzieren kann... eine methode halt
  • aah ich hab den Bug verbessert ich hab nur selbst n Fehler reingehauen :D
    Ich hab nämlich das move_snap weg gemacht und dann hab ich noch bei der Kollisionsabfrage mouse_x und nicht other.x reingeschrieben.
    Jetzt hab ich einfach wieder move snap reingemacht und die Maus auf mouse_x/y gedrawt.
    Achja und das mit den Ebenen brauch ich fürs erste nicht.
    Yaaaay ändlich funzt alles danke an alle :)
    Und hier nochmal die Datei, aber diesmal die richtige.
    Wenn man jetzt linksklick auf lock macht werden alle locks zu 0 und bei rechts zu 1
    Dateien
    • EditorBsp.zip

      (11,79 kB, 396 mal heruntergeladen, zuletzt: )
    Twitter: @BytingGames