• 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!

GML Trying to figure out how to combine Shaun's wall jumping tutorial code with his tile collision code

J

Jonar

Guest
I want to make a plat-former that has wall jumping as well as tile based collisions. After combining Shaun's wall jumping code with his tile collision code and making a few tweaks, I can't seem to get it to work. Any ways I could make my code work better?

Create
// sets animation

sprite_index = s_player_idle


// starting speeds (don't change)

hsp = 0;
vsp = 0;

hsp_frac = 0;
vsp_frac = 0;


// left/right speeds

hsp_acc = 1;
hsp_fric_ground = 2;
hsp_fric_air = 1;
hsp_walk = 8;
hsp_walljump = 10;


// jump/max-fall speeds

vsp_jump = -15;
vsp_max = 15;
vsp_walljump = -12;
vsp_max_wall = 5;


// variables that check for if you are touching a wall or the ground (also don't change these)

onground = false;
onwall = false;


// gravity

grv = 0.5;
grv_wall = 0.1;


// other stuff

jumpbuffer = 0;
walljumpdelay = 0;
walljumpdelay_max = 17;

hascontrol = true;


// tile collision

tilemap = layer_tilemap_get_id("Collision");\

Step
var bbox_side;


// get player input
#region
if (hascontrol) {

key_left = keyboard_check(vk_left);
key_right = keyboard_check(vk_right);
key_up = keyboard_check(vk_up);

}

else {

key_right = 0
key_left = 0
Key_up = 0

}
#endregion

// calculate horizontal movement
#region
walljumpdelay = max(walljumpdelay - 1, 0);

if (walljumpdelay == 0) {

var dir = key_right - key_left;
hsp += dir * hsp_acc;

if (dir == 0) {

var hsp_fric_final = hsp_fric_ground;
if (!onground) hsp_fric_final = hsp_fric_air;
hsp = approach(hsp, 0, hsp_fric_final);

}

hsp = clamp(hsp, -hsp_walk, hsp_walk);

}
#endregion

// wall jump
#region
if (onwall = true) and (!onground) and (key_up) {

walljumpdelay = walljumpdelay_max;

hsp = -onwall * hsp_walljump;
vsp = vsp_walljump;

hsp_frac = 0;
vsp_frac = 0;

}
#endregion

// calculate vertical movement
#region
var grv_final = grv;
var vsp_max_final = vsp_max;

if (onwall != 0) and (vsp > 0) {

grv_final = grv_wall;
vsp_max_final = vsp_max_wall;

}

vsp += grv_final;

vsp = clamp(vsp, -vsp_max, vsp_max);


// ground jump

if (jumpbuffer > 0) {

jumpbuffer--;

if (key_up) {

jumpbuffer = 0;
vsp = vsp_jump;
vsp_frac = 0;

}

}
#endregion

// dump fractions and get final integer speeds
#region
hsp += hsp_frac;
vsp += vsp_frac;

hsp_frac = frac(hsp);
vsp_frac = frac(vsp);

hsp -= hsp_frac;
vsp -= vsp_frac;
#endregion

// horizontal collision
#region
if (hsp > 0) bbox_side = bbox_right; else bbox_side = bbox_left; // direction collision is happening

if (tilemap_get_at_pixel(tilemap, bbox_side + hsp, bbox_top) == true) or (tilemap_get_at_pixel(tilemap, bbox_side + hsp, bbox_bottom) == true) { // if touching tilemap

onwall = true;

if (hsp > 0) x -= (x mod 16) + 15 - (bbox_right - x);
else x += (x mod 32) + (bbox_left - x);

hsp = 0;

}

x += hsp;
#endregion

// vertical collision
#region
if (vsp > 0) bbox_side = bbox_bottom; else bbox_side = bbox_top; // direction collision is happening

if (tilemap_get_at_pixel(tilemap, bbox_left, bbox_side + vsp) == true) or (tilemap_get_at_pixel(tilemap, bbox_right, bbox_side + vsp) == true) { // if touching tilemap

if (vsp > 0) {

y -= (bbox_bottom mod 16) - (bbox_bottom - y); // move player on top of ground

}

else y += (y mod 32) + (bbox_top - y); // move player below ground

vsp = 0;

}

y += vsp;
#endregion

// calc current status
#region
if (onground) jumpbuffer = 6;


// death check

if (y > room_height) {

hascontrol = false;
slide_transition(TRANS_MODE.RESTART);

}
#endregion
 
Top