Problem mit 16x16 Raster

    Da gibt es sogar 2 gute Möglichkeiten für Movement und Kollisionschecks.
    Ich lasse dich entscheiden:

    Version 1 - wie Bisher mit Objekten und der Kollisionsabfrage collision_rectangle.

    oder

    Version 2 - mit einem Array / ds_grid, Objekte werden irrelevant. Alle Koordinaten werden auf ein 1 x 1 Raster geschrumpft, gezeichnet wird aber noch auf dem 16 x 16. Kollisionschecks werden einfacher auszuführen und sparen an Performance. Potentielle Level-grösse wird vervielfacht.
    Hi

    So habe mir jetzt mal alles durchgelesen um nicht irgendwas falsches ab zu liefern.
    Ich habe es erst mal so wie Rhazul programmiert, sprich dein Player konnte sich frei bewegen, ohne Raster. Als das nicht deinen Wunsch entsprach, habe ich mich an mein Boluder Dash Klon gehalten, dort wird mein Player in einen Raster von 32 Pixel bewegt.
    Dazu musste ich alles von deinen Code entfernen was mit der Bewegung des Players zu tuen hatte. Kann nur hoffen du kommst damit zu recht. Auch habe ich die Kollisionsmaske abgeschalten beim Sprite. Ich habe dafür dein Kollisionsprite verwendet.
    Dein Player läuft jetzt genau auf ein Raster von 32 Pixel. Du kannst das Raster aber auf deinen Wunsch anpassen. Du musst dann nur dein Player frisch setzten damit es auf den Raster passt den du willst. Denn sonst bekommst du Probleme mit der Kollision von der Wand.
    Also hier der Link von der Datei:
    ul.to/0va7q6xp

    Denn Code im Step Event kannst du ruhig löschen, der war für die freie Bewegung des Playeres zu ständig.
    Gruß Drachen

    Matt Mats schrieb:

    Ich verstehe nicht, warum ihr alles verändert und den ganzen code entfernt wenn es nur um die kollisionsmaske geht?


    Wir sind alle wahnsinnig und haben den Drang alles optimal zu gestalten und zu optimieren.
    Das Problem wird sein das du mit deinem Ansatz niemals das Verhalten erzielen werden kannst was du gerne hättest. Man muss beim programmieren auch mal loslassen können und eingestehen das man unfunktionalen mist produziert hat. Nicht böse sein aber ich weiß nicht wie ich es schonender verpacken könnte^^
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
    Ich bin ja überhaupt nicht böse aber ich warte nur auf jemanden, der mir verständlich erklärt was genau nicht stimmt und was man tun muss damit es stimmt^^
    Bisher haben mir gefühlt 20 Leute 30 Sachen erzählt und ich hab kein Wort verstanden.
    Also, was ist an meiner Programmierung falsch und wie löse ich das Problem?

    Matt Mats schrieb:

    Ich bin ja überhaupt nicht böse aber ich warte nur auf jemanden, der mir verständlich erklärt was genau nicht stimmt und was man tun muss damit es stimmt^^
    Bisher haben mir gefühlt 20 Leute 30 Sachen erzählt und ich hab kein Wort verstanden.
    Also, was ist an meiner Programmierung falsch und wie löse ich das Problem?


    Ich dachte wir hatten das Problem schon gelöst. Gibt's da noch weitere Probleme?

    Matt Mats schrieb:

    Ich verstehe nach wie vor nicht weshalb ich meinen ganzen Code jetzt über den Haufen schmeißen soll wenn es doch nur um die Kollision geht.
    Da warte ich nach wie vor auf jemanden der mir das verständlich erklärt^^


    Ich lad mir das Projekt mal runter und schau mirs an. Dann kann ich dir sagen ob du die Kollisionschecks ändern musst.
    Habs mir angeschaut und hab ein par Screenshots gemacht.

    Bild 1
    snap X und snap Y im Room-editor auf 16 x 16
    Du musst umbeding aufpassen das die grössen der Wandobjekte keine Kommazahlen bekommen. Das ist ein bug von GMS welcher manchmal diese einfügt.

    Bild 2
    Einen Sprite erstellen (maske)

    Bild 3
    Die Ursprünge der playersprites auf diese Koordinaten stellen

    Bild 4
    Der Spieler braucht einen kleinen start offset weil der Ursprung mittig gesetzt ist.
    Bilder
    • screenshot1.png

      31,42 kB, 560×455, 23 mal angesehen
    • screenshot2.png

      11,93 kB, 678×364, 21 mal angesehen
    • screenshot3.png

      13,36 kB, 678×364, 25 mal angesehen
    • screenshot4.png

      43,47 kB, 738×853, 22 mal angesehen
    Hi

    Jetzt verstehe ich rein gar nichts mehr. Du beklagst dich weil andere dir deinen Code verworfen haben.
    Du hast nie erwähnt ob die Codes die dir die anderen geschrieben habe, deinen Ziel näher kamen.
    Statt dessen willst du von jemanden erklärt bekommen wie man deien Code umschreiben muss damit es läuft. Also ich habe mir deinen Code angeschaut, umd kam zur Erkenntnis das ich davon nichts gebrauchen konnte.
    Deswegen habe ich deinen Code komplett umgeschrieben. Und ich vermute mal, bei den anderen war es nicht anders. Du musst verstehen, das es immer schwer ist, auf ein vorhandenes System ein völliges anders System zu Integrieren.
    Aber ich versuche mal meinen Code dir zu erklären.
    Event: obj_Player_Left:

    GML-Quellcode

    1. /// Player läuft nach links
    2. if ( !place_snapped(raster,raster) ) exit; // Überprüft ob das Objekt sich im Raster befindet,
    3. // wenn ja verlasse das Event. Ansonsten führe die andere Befehle aus
    4. speed = spd;
    5. direction = 180
    6. sprite_index = spr_player_left;
    7. image_speed = ani;


    mehr macht der Code nicht. Dein Player läuft also, hier jetzt bei mir, genau 32 Pixel. Danach hält her an. Das selbe geschied auch in den anderen Richtungen.
    Ein ziemlich leicht verständlicher Code.

    Also ich bin dann mal raus aus der Geschichte, werde es aber weider verfolgen. Weil ich wissen will ob das jemand hinbekommt.
    Denn wir wissen alle, das viele Wege nach Rom führen.
    Aber ich finde es auch gut, das du deinen Code verstehen willst.


    Gruß Drachen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Drachen“ ()

    Matt Mats schrieb:

    Gut soweit habe ich alles,
    nur noch 2 kleine schwierigkeiten, erstens wie platziere ich den charakter im raum vernünftig
    und 2 bei mir ist diese kleine box nicht sichtbar


    Ach ja genau, das hab ich vergessen. Hat zwar nichts mit der Funktion zu tun aber es hilft natürlich :
    Ich habe einen Draw-Event hinzugefügt und dort einen Code gemacht:

    GML-Quellcode

    1. draw_sprite(spr_player_box, 0, x, y);
    2. draw_self();

    Matt Mats schrieb:

    Danke, letztes Problem (hoffentlich)
    Wie platziere ich den Character vernünftig? :)


    Einfach irgenwo hin. Mit dem Raster auf 16 x 16
    Bilder
    • screenshot5.png

      99,87 kB, 1.487×926, 20 mal angesehen