• Hey Guest! Ever feel like entering a Game Jam, but the time limit is always too much pressure? We get it... You lead a hectic life and dedicating 3 whole days to make a game just doesn't work for you! So, why not enter the GMC SLOW JAM? Take your time! Kick back and make your game over 4 months! Interested? Then just click here!

GameMaker Fake 3d Collision in Beat 'Em Up

In the beat 'em up I'm making, I have a variable (z) that I use to give the illusion of things rising up off of the ground ( This should give you the idea: https://yal.cc/top-down-bouncing-loot-effects/ ). The problem I've encountered is in trying to add basic collisions on this axis. What I want to happen is if there is a solid with a z greater than the players (lower down), the player can jump over/onto it, and be at that z level, and if the solid's z is less than the players (higher up), the player collides with it. I've made several semi-successful attempts at this, but they all seem over-complicated, and also don't work with more than one z level besides 0.

My code so far:
Code:
// I use custom hitboxes, so "x1" is the left of the hitbox, "y1" is the top, "x2" is the right, and "y2" is the bottom

// "bw" and "bh" are the width and height of the hitbox respectively

// "z" is the distance from the ground, 0 being default, the lower the higher off the ground

// "ground_z" is the z of the ground, so what the z should be colliding with. This is what should change for collisions



/// Normal Collisions (I only included right side for the sake of space, but all of the other directions work the same way)

//Right
if (xvel>0)
{
    co = noone;
    co_d = abs(xvel);
  
    with (obj_solid)
    {
        if ((y1<other.y2) and (y2>other.y1) and (x1<=(other.x2+other.xvel)) and (x1>=other.x2))
        {
            var _d = (x1-other.x2);
            if _d<other.co_d {other.co=id; other.co_d=_d;};
        }
    }
  
    if (co!=noone)
    {
        x2 = co.x1;
        x1 = x2-bw;
        xvel = 0;
    }
    else
    {
        x1 += xvel;
        x2 += xvel;
    }
}



///My Z collision code so far (I've tried combining this with the normal collisions to mixed results)

with (obj_solid)
{
    if ((z >= other.z) and (y1 < other.y2) and (y2 > other.y2) and (x1<other.x2) and (x2>other.x1))
    {
        other.ground_z = z;
    }
    else
    {
        other.ground_z = 0;
    }
}
 
Top