depth mit z-achse

  • depth mit z-achse

    hallo, ich sitze mal wieder vor einem rpg, bei dem auch eine höhe haben kann(z), weil man auch auf objects draufklettern kann. jedes object hat eine height und der player hat die z-achse(je höher, desto weiter oben wird der sprite gezeichnet). bis jetzt hab ich das mit der depth so gemacht:
    beim player:

    GML-Quellcode

    1. depth=-y*(z/16) //das /16 ist, damit die zahlen nicht zu hoch werden.


    bei den hindernissen:

    GML-Quellcode

    1. depth=-y


    jetzt mein problem: wenn der player hinter einem object ist und auf irgendeine weise an höhe gewinnt(hochkletter, springen, etc.), dann ist der player ab einer höhe von 16 pixeln vor dem object, weil er ja jetzt die höhe mit dem y-wert multipliziert.
    weiß vielleicht jemand, wie ich das beheben kann?


  • Also erstmal würde ich vorschlagen, dass du wenn überhaupt dann bitte auch
    bei den Hindernissen die gleiche Formel zur Tiefenberechnung verwendest.
    Im Übrigen brauchst du dir keine Sorgen darum zu machen, dass die Depth die
    Werte |10.000| überschreitet, da man die Räume sowieso nicht größer anlegen sollte.

    Somit wäre schon mal eine Fehlerquelle ausgeschaltet.

    Um jetzt zu verhindern, dass dein Character durch die Hindernisse durchspringen kann
    würde ich dafür sorgen, dass entweder:
    Der Character nicht höher als 15 Pixel springen kann
    oder:
    bei einem Sprung über 16 Pixel Höhe eine art selbstgefertigte Kollision eintrifft,
    die den Character davon abhält durch das Objekt zu springen
    oder:
    du lässt das mit dem Springen ganz sein und wenn du wirklich darauf bestehst
    kannst du ja noch extra aktionen definieren, welche (wie beim RPG Maker oder
    beispielsweise bei Golden Sun) den Characteran bestimmten Stellen per
    Knopfdruck zu bestimmten nahegelegenen Stellen springen lässt.
    Hier werden sie geholfen:
    [Regeln] [GML] [Hilfe] [Suche] [Posten] [Duden.de]
    [Wenn das alles nicht mehr hilft] [Dunning-Kruger]


    "Die Vernunft sollte Autorität definieren; nicht umgekehrt!"
    "Selber denken regt das Gehirn an."
    - Niffel f.k.a. Kilik
  • Ähm... die Depth muss sich doch garnicht mit der Z-Achse verändern, oder? Es reicht doch völlig aus die Y-Achse zu berücksichtigen. Ausnahme wäre, wenn Du auch sowas wie Brücken hast, wo man drunter durchgehen kann. Wenn Du aber nur verschiedene Höhen hast im Sinne, dass man auf Kisten etc. draufklettern kann und die Höhe nur durch eine verschiebung des Sprites relativ zum Objekt veränderst, dann ist die Z-Achse des Objekts für die Depth irrelevant (war bei mir zumindest so, als ich so eine ähnliche Engine gemacht habe, solange ich keine Unterführungen machen wollte - bei den Unterführungen musste ich dann, wenn ich mich recht erinnere, von der Depth nur noch die Höhe subtrahieren, dann war auch das gegessen).

    €dit: Ehrlich, probier es mal aus! Entferne die Z-Achse gänzlich aus deiner Depth-Formel. Dann dürftest Du keine Probleme haben (natürlich hängt das vom Rest der Engine ab, aber Du müsstest da schon echt was seltsames und unlogisches gebastelt haben, wenn's dann nicht klappt).

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

  • Wenn Du hinter der Kiste bist, dann ist auch deine Y-Position niedriger und wie ich sagte: Die Y-Achse ist der einzige wichtige Faktor für die Depth. Die Z-Achse ist da irrelevant für. Wenn nicht, dann hast Du irgendwas an deiner Engine verkorkst. Wäre auch nett, wenn Du ein kleines Beispiel aus deiner Engine geben könntest (von mir aus mit Dummy-Grafiken), bloß damit ich's dir direkt zeigen kann. Ehrlich: Wenn Du "hinter" einer Kiste stehst, dann ist deine Y-Position niedriger und damit deine Depth höher und Du wirst automatisch von der Kiste vor dir verdeckt. Wozu die Z-Achse einbeziehen?

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

  • So, deine Zeichnung zeigt, dass deine Engine verkorkst ist. Hier zeige ich dir mal, wie es konzeptionell aussehen muss:


    Quali ist etwas kacke, aber egal... ich habe mal eine leicht schräge Darstellung genommen, weil man da die Funktionsweise besser festhalten kann.
    Grundsätzlich gilt erstmal: Jedes Objekt existiert nur als Collisionmask in einem völlig zweidimensionalen System. Das sind hier für die Charaktere die roten Kreise mit dem Kreuz drin. Das Sprite, welches der Spieler sieht, wird zusätzlich gezeichnet, und zwar an der Höhe der Collisionmask + Z-Position (welche Du ja in einer zusätzlichen Variable festhältst). Nun hat jedes Objekt eine Höhe. Die Kiste hat als Z-Position ihre Höhe (bzw. Größe). Das entspricht also der Länge der blauen Linien im Bild. Sagen wir mal der Spieler will auf die Kiste springen, dann muss das so aussehen, dass Du natürlich eine Sprung+Graviationsformel für die Z-Achse hast. Springst Du nun, bewegt sich der Charakter entlang der Z-Achse nach oben. Jetzt kommt erstmal eine Sache: Trifft die Collisionmask des Spielers auf die (hier violett dargestellte) Collisionmask der Kiste, so bleibt der Spieler hängen, sofern er nicht gerade hoch genug springt. Er läuft ja dann quasi dagegen! Also sobald sein Oval mit Kreuz das Violette-Feld berührt. Springt er jedoch, verändert sich sein Z-Wert, der Sprite bewegt sich nach oben, die Collisionmask bleibt jedoch an Ort und Stelle. Wenn der Z-Wert des Spielers den Z-Wert der Kiste übersteigt, kommt er drauf, klar. Und so lange seine ovale Collisionmask im Kontakt mit der violetten Collisionmask der Kiste bleibt, fällt er auch nicht wieder runter- Logisch. Und die Depth jedes Objekts (und dargestellten Sprites) wird bestimmt durch die negative Y-Position der Collisionmask. Wie verhindern wir aber nun, dass der Spieler von der Kiste überdeckt wird, wenn er zu weit nach oben geht, obwohl er noch drauf steht? Klar: Die Origin der Kiste gehört an den obersten Punkt ihrer Collisionmask. Das heißt also, dass der Spieler erst wieder von der Kiste verdeckt wird, wenn er so weit nach oben gegangen ist, dass er nicht mehr auf ihr drauf steht. Wie das Sprite der Kiste aussehen muss, kannst Du dir wohl ausmalen: Eine Fläche parallel zur Collisionmask auf einer Höhe, die dem Z-Wert (also der Höhe) der Kiste entspricht + die Vorderseite (davon ausgehend, dass Du nur die Vorderseite der Kiste zeigst - würden wir wirklich ISO-3D machen, ähnlich wie in meiner Darstellung, müssten wir jede Kistenseite als eigenes Objekt machen, aber zu deinem Zweck reicht wohl das, was ich beschrieben habe).

    Solltest Du meine Erklärung nicht ganz verstanden haben (die ist ja doch ziemlich wirr...), bastel ich dir vielleicht auch ein Example.