External Exam Download Resources Web Applications Games Recycle Bin

Platformer


increase room width:

create the sprites, objects & room. Set objBlock property: Solid

add actions as follows, note Key Down - Right is the same as left, just positive value (not negative)

enable Viewport 0 in room properties, adjust settings as you please:


set up scene same as above, make sure objBlock property: Solid

objDude Step Event:

/// @description player controller

//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 - 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 );
}

objDude End Step Event:

/// @description collision correction!

//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;
    }
}

objDude Collision Event (with objBlock):

///empty script to trigger collision :)