Dividious
Member
So after changing to a FSM to solve some other issues and getting rid of the Shaun Spalding Platform Code and replacing it. My horizontal and vertical moving platforms work, however i can't figure out how to do a One Way "passthru/jumpthru/fallthru" type platform. Currently my player object has the main collision code in a script while platform code resides in the player step event.
I do have an "par_platforms" parent object for obj_h_platform, obj_v_platform, obj_passthru
Player Object-Step Event
Move_Player Script
obj_v_platform Create Event
obj_v_platform Begin Step Event
I know its not the most beautiful slapped together code but it works.. except the One Way "passthru/jumpthru/fallthru" part... I've tried many different methods and I just cant get it to work.. or maybe they all have and just the inputs are jacked.
just in case here is the input
GetInput Script
any help would be great
I do have an "par_platforms" parent object for obj_h_platform, obj_v_platform, obj_passthru
Player Object-Step Event
Code:
if (object_id != noone)
{
if (x <= object_id.bbox_left) || (x >= object_id.bbox_right) object_id = noone;
}
//Verticle Moving Platforms Collision
//New Value
var nvspd = round(vspd=min(vspd+gravity_inc*false,gravity_max));
//Recalculates with the New Value
if (place_meeting(x,y+nvspd,_solid_parent))
{
while(!place_meeting(x,y+sign(nvspd),_solid_parent))
{
y = y + sign(nvspd);
}
vspd = 0;
var object_inst = instance_place(x,y+1,_solid_parent);
if (object_inst != noone) object_id = object_inst;
}
y = y + vspd;
Move_Player Script
Code:
against_wall = [0,0];
/// @description ap_move_player
/// @param {real} Control_Effectivness >=0
/// @param {real} Friction_Effectivness >=0
/// @param {real} Gravity_Effectivness >=0
/// returns array representing the vector of detected collisions
//Horizontal
hspd += (right[held]-left[held])*(move_accel*argument0);
hspd=clamp(hspd,-move_max_speed,move_max_speed);
if(place_meeting(round(x)+ceil_signed(hspd),round(y),_solid_parent))
{
round_position();
while(!place_meeting(x+sign(hspd),y,_solid_parent))
x+=sign(hspd);
against_wall[0]=sign(hspd);
hspd=0;
}
x+=hspd;
hspd=approach(hspd,0,move_friction*argument1);
//vertical
vspd=min(vspd+gravity_inc*argument2,gravity_max);
if(place_meeting(round(x),round(y)+ceil_signed(vspd),_solid_parent))
{
round_position();
while(!place_meeting(x,y+sign(vspd),_solid_parent))
y+=sign(vspd);
against_wall[1]=sign(vspd);
vspd=0;
grace_frames=max_grace_frames;
}
else
grace_frames -= grace_frames > 0;
y+=vspd;
wall_escape(_solid_parent);
obj_v_platform Create Event
Code:
dir=-1; //direction vertical]spd=1;
vspd=0;
hspd=0;
obj_v_platform Begin Step Event
Code:
vspd=dir*spd;
//Vertical Collision
if(place_meeting(round(x),round(y)+ceil_signed(vspd),_solid_parent))
{
round_position();
while(!place_meeting(x,y+sign(vspd),_solid_parent))
y+=sign(vspd);
vspd=0;
dir*=-1;
}
y+=vspd;
if (obj_ap_player.object_id = id)
{
obj_ap_player.x += hspd;
obj_ap_player.y += vspd;
if (obj_ap_player.bbox_bottom >= bbox_top) obj_ap_player.y--;
}
just in case here is the input
GetInput Script
Code:
var _key = vk_shift;
engarde[pressed] = (keyboard_check_pressed(_key)||gamepad_button_check_pressed(0,gp_shoulderlb));
engarde[released] = (keyboard_check_released(_key)||gamepad_button_check_released(0,gp_shoulderlb));
if(keyboard_check(_key))
engarde[held]++;
else
engarde[held]=0;
var _key = ord("D");
slide[pressed] = (keyboard_check_pressed(_key)||gamepad_button_check_pressed(0,gp_face2));
slide[released] = (keyboard_check_released(_key)||gamepad_button_check_released(0,gp_face2));
if(keyboard_check(_key))
slide[held]++;
else
slide[held]=0;
var _key = ord("A");
attack[pressed] = (keyboard_check_pressed(_key)||gamepad_button_check_pressed(0,gp_face3));
attack[released] = (keyboard_check_released(_key)||gamepad_button_check_released(0,gp_face3));
if(keyboard_check(_key))
attack[held]++;
else
attack[held]=0;
_key = ord("S");
jump[pressed] = (keyboard_check_pressed(_key)||gamepad_button_check_pressed(0,gp_face1));
jump[released] = (keyboard_check_released(_key)||gamepad_button_check_released(0,gp_face1));
if(keyboard_check(_key))
jump[held]++;
else
jump[held]=0;
_key = vk_left;
left[pressed] = (keyboard_check_pressed(_key)||gamepad_button_check_pressed(0,gp_padl));
left[released] = (keyboard_check_released(_key)||gamepad_button_check_released(0,gp_padl));
left[held] = (keyboard_check(_key)||gamepad_button_check(0,gp_padl));
_key = vk_right;
right[pressed] = (keyboard_check_pressed(_key)||gamepad_button_check_pressed(0,gp_padr));
right[released] = (keyboard_check_released(_key)||gamepad_button_check_released(0,gp_padr));
right[held] = (keyboard_check(_key)||gamepad_button_check(0,gp_padr));
_key = vk_up;
up[pressed] = (keyboard_check_pressed(_key)||gamepad_button_check_pressed(0,gp_padu));
up[released] = (keyboard_check_released(_key)||gamepad_button_check_released(0,gp_padu));
up[held] = (keyboard_check(_key)||gamepad_button_check(0,gp_padu));
_key = vk_down;
down[pressed] = (keyboard_check_pressed(_key)||gamepad_button_check_pressed(0,gp_padd));
down[released] = (keyboard_check_released(_key)||gamepad_button_check_released(0,gp_padd));
down[held] = (keyboard_check(_key)||gamepad_button_check(0,gp_padd));
var _h = right[held]-left[held];
if(point_distance(0,0,_h,0) > 0)
dpad_dir=point_direction(0,0,_h,0);
else
dpad_dir=no_direction;
Last edited: