External Exam Download Resources Web Applications Games Recycle Bin

GML - Collision Correction Alternative



SpriteImages
sprPlayer
sprBlock
ObjectSpriteProperties
objPlayersprPlayerVisible
objBlocksprBlockVisible, and MARK AS SOLID this time
//controls for movement:
hkey = keyboard_check( vk_right ) - keyboard_check( vk_left );

//check if on ground:
if( place_free( x, y+1 )){
    gravity = 0.8; //set gravity, as we are in the air
} else {
    gravity = 0; //no need for gravity on ground

    //since we are on ground at this point,
	//we can check if we need to jump:
    if( keyboard_check_pressed( vk_up )){
        vspeed = -12;
    }
}

//set horizontal movement based on controls:
if( hkey == 0 ){
    hspeed *= 0.75; //friction
    if( abs( hspeed ) < 0.5 ){ hspeed = 0; }
} else {
    hspeed *= 0.75;
    hspeed += 2 * sign( hkey );
}
//first check if we need to correct for collision:
if( speed != 0 and x == xprevious and y == yprevious ){

    //move up first if vspeed is up:
    if( vspeed < 0 ){
        move_contact_solid( 90, -vspeed );
    }

    //move over if hspeed is not 0:
    if( hspeed != 0 ){
        //(setting some temporary variables we will use):
        temp_y = y;
        //move up:
        move_contact_solid( 90, abs( hspeed ));
        //move over:
        move_contact_solid( 90 - sign( hspeed ) * 90, abs( hspeed ));
        //move down (what we've moved up):
        if(temp_y-y != 0){
            move_contact_solid( 270, temp_y-y);
        }
        //move down again if it puts us on ground:
        if( !place_free( x, y + abs( hspeed ) + 1 )){
            move_contact_solid( 270, abs( hspeed ));
        }
    }
	
    //move down if vspeed is down:
    if( vspeed > 0 ){
        move_contact_solid( 270, vspeed );
    }
	
    //if we are blocked then set vspeed to 0:
    if( !place_free( x, y + sign( vspeed ))){
        vspeed = 0;
    }
	
    //set hspeed to 0 if we can't move horizontally (we're blocked):
    if( hspeed != 0 and x == xprevious ){
        hspeed = 0;
    }
}
// empty script to trigger collision event - important!

thoughts? the remaining tutorials will not use this alternative (FYI)