1. Hey! Guest! The 36th GMC Jam will take place between February 27th, 12:00 UTC - March 2nd, 12:00 UTC. Why not join in! Click here to find out more!
    Dismiss Notice

Windows Game freeze upon colliding with a corner.

Discussion in 'GameMaker Studio 2 Community Tech Support' started by a_lone_, Feb 9, 2020.

  1. a_lone_

    a_lone_ Member

    Joined:
    Feb 9, 2020
    Posts:
    1
    I've spent a while getting my movement code with proper acceleration and smooth collisions to work with as a little code as possible, and while I was doing so my ideas changed a lot and the code still has remnants of old organization. At some point in the process, I discovered that whenever I made a pixel-perfect collision with a corner, the game window would freeze and have to be closed using the IDE's stop button, or a task manager end task. I thought I'd fix this probably later, but I still have not been able to locate its source.

    Code:
    //get input
    yin = (keyboard_check(ord("S")) - keyboard_check(ord("W")));
    xin = (keyboard_check(ord("A")) - keyboard_check(ord("D")));
    inDir = point_direction(0,0,xin,yin);
    
    //round small velocities to 0
    if abs(vx) < 0.3 {
        vx = 0;
    }
    if abs(vy) < 0.3 {
        vy = 0;
    }
    
    //friction
    vx -= kfrict*vx;
    vy -= kfrict*vy;
    
    //acceleration
    ax = (((dcos(inDir))*abs(xin)*movespeed)/mass);
    ay = (((dsin(inDir))*abs(yin)*movespeed)/mass);
    
    aMag = point_distance(x,y,x+ax,y+ay);
    aDir = point_direction(x,y,x+ax,y+ay);
    
    if abs(vy+ay) <= abs(yin*vmax) and abs(vx+ax) <= abs(xin*vmax) {
        vy += ay;
        vx += ax;
    } else if abs(vy+ay) <= abs(yin*vmax) {
        vy += ay;
    } else if abs(vx+ax) <= abs(xin*vmax) {
        vx += ax;
    } else if abs(vy + ay) < abs(vy) {
        vy += ay;
    } else if abs(vx + ax) < abs(vx) {
        vx += ax;
    }
    
    //collisions and movement
    
    if place_meeting(x-vx,y-vy,oWall) {
        while !place_meeting(x-sign(vx),y-sign(vy),oWall) {
            y-=sign(vy);
            x-=sign(vx);
        }
        if !place_meeting(x,y-vy,oWall) {
            y -= vy;
        }
        if !place_meeting(x-vx,y,oWall) {
            x -= vx;
        }
    } else {
        x -= vx;
        y -= vy;
    }
    
    Feel free to roast my code as well, like I said it's a bit scatterbrained and could be smaller and more organized.
     

Share This Page