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