Depth & Instace order

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

  • Depth & Instace order

    Ich hab mal wieder ein kleines Problem bei der Entwicklung meines Puzzle Games.
    Es geht um folgendes:
    Ich möchte das 2 unterschiedliche Puzzleteile jeweils beim daraufklicken des einen oder des anderen eine Ebene nach oben kommen und somit am höchsten über allen anderen Teilen liegen(das habe ich auch durch depth gelöst),sie sollen sich bei Doppelklick dann auch drehen(auch gelöst durch image_angle).
    Die Puzzle-Teile werden auf Objecte gezeichnet mit dem Draw Event.
    Bei jedem klick auf ein Teil wird diesem eine Globale Depth Variable zugewiesen welche um 1 abgezogen wird, wodurch ein angeklicktes Teil immer über die anderen gezeichnet wird.
    Die Collision Mask ist auf Presice eingestellt wodurch nur der gezeichnete Bereich angeklickt werden kann.
    Durch eine Selcted true/false Funktion kann auch immer nur jeweils ein Puzzle Teil bewegt/gedreht werden.

    Das Puzzle funktioniert soweit ganz gut, nur habe ich jetzt folgendes Problem:
    liegen die Teile übereinander kommt beim klicken über beiden Teilen immer das Puzzle-Teil nach oben welches in der Instance order am höchsten ist, egal wie die Depth eingestellt ist, es sollte aber gar nicht unter dem gezeichneten Bereich des anderen klickbar sein. Sinn der Sache ist wenn ein Spieler ein Puzzle drehen will und ein anderes Teil darunter liegt soll nicht,dass nicht gewollte Teil plötzlich nach oben kommen. Wenn ich das unerwünschte Teil nicht anklickbar mache sobald ein anderes drüber liegt, wird man es nicht mehr wegziehen können wenn man auf einen sichtbaren Bereich klickt, da diese auch versetzt übereinander liegen können.
    Wie mache ich es nun, dass nur der sichtbare Bereich der Puzzle-Teile klickbar ist, wenn diese übereinander liegen und der nicht sichtbare nicht klickbar ?

    Ich möchte, dass immer nur das obere Teil anklickbar ist, wenn mehrere gestapelt liegen,es sei den man klickt auf den sichtbaren gezeichneten Bereich des Unterlegenen Puzzle-teils.
    Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken
    8|
  • Es ist bei den Collisionen im GM nicht immer klar, welche object ID bei einer collision zurückgegeben wird, dh wird nicht immer die ID mit der höchsten depth zurückgegeben wenn ein paar obj übereinander liegen.
    Deswegen würde ich dir vorschlagen alle Puzzleteile in einem Array abzuspeichern wo, deren ID, depth und vllt rotation drinstehen.

    GML-Quellcode

    1. tiles = ds_grid_create(puzzleteileAnzahl,3);
    2. tiles[i,0] = id;
    3. tiles[i,1] = id.depth
    4. tiles[i,2] = id.rotation


    Wenn du dann zB mit collision_point nach dem puzzletile suchst, dass du anklicken willst, speicherst du alle instances die im umkreis deines mauszeigers sind in ein array und holst dir dann die id die zB die niedrigste/höchste depth (also das sichtbarste puzzletile im umkreis von 2px des mauszeigers zB, denn das ist das wahrscheinlichste dass du grade anklicken möchtest). Und dann stellst du deren depth höher und aktialisierst den eintrag im array.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • @Aku_Ryou
    du hast den Accessor vergessen
    grid[# x,y]

    Ich würde eher einfach mit with arbeiten.

    GML-Quellcode

    1. var obj = noone; //variable, die später das Objekt zugewiesen bekommt
    2. var d; //Variable, die es ermöglicht, später zu checken, ob die depth von einem Objekt höher als die von einem anderen ist
    3. with(objekt){ //rufe diesen Code in allen Objekten auf
    4. if(distance_to_point(mouse_x,mouse_y)<=2){ // wenn Entfernung zur Maus kleiner gleich 2 ist
    5. if(obj == noone){ //wenn dieses Objekt als erstes aufgerufen wurde, kann direkt die eigene depth eingetragen werden.
    6. obj = id;
    7. d = depth;
    8. }
    9. else{
    10. if(d>depth){ //wenn die depth größer als die von einem "führenden" obj ist
    11. obj = id;
    12. d = depth;
    13. }
    14. }
    15. }
    16. //obj ist noone, wenn es kein solches obj gibt
    17. //und sonst hast du dein obj.
    18. }
    Alles anzeigen
    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
  • Hoppla, ich hab da überhaupt doppelt gemoppelt. Denn du brauchst keine ds_grid, wenn du eh nur die IDs in ein Array speicherst, denn über die gespeicherte id kommst du eh an depth und rotation. Ich würde das Array empfehlen, da du es für viele Dinge benutzen kannst die dir beim puzzle helfen, zB ob alle Tiles richtig gedreht sind. Oder ähnliche Spielereien.

    @Husi012 bei deiner Methode muss ich dazusagen, dass distance_to_point von der kante der collisionmask aus berechnet und daher nicht immer das Puzzletile zurückgibt das man wirklich haben möchte, sondern das welches mit seinem rand am nächsten zur maus ist. Mit collision_point, oder collision_circle und dem abchecken der instances welcher am höchsten liegt bekommt man auf jeden Fall das gewünscht puzzletile in die hand, keines welches daneben liegt und keines welches eigtl drunter liegt.

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