Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //initialize
- var x_temp, y_temp, x_target, y_target, h_collision_list, v_collision_list, _c, i, _n, _n2;
- x_prev = x + x_slop;
- y_prev = y + y_slop;
- x_temp = x_prev;
- y_temp = y_prev;
- x_target = x_prev + x_speed;
- y_target = y_prev + y_speed;
- h_collision_list = ds_list_create();
- v_collision_list = ds_list_create();
- //get h_collision_list
- if x_speed < 0 and bool( collision_rectangle( bbox_left + x_slop + x_speed, bbox_top, bbox_left + x_slop, bbox_bottom, tmp_block, 0, 1 ) ) {
- _c = 0;
- while _c != noone {
- _c = collision_rectangle( bbox_left + x_slop + x_speed, bbox_top, bbox_left + x_slop, bbox_bottom, tmp_block, 0, 1 );
- if _c != noone {
- ds_list_add( h_collision_list, _c );
- instance_deactivate_object( _c );
- }
- }
- //truncate x_speed to nearest obstacle if needed
- if ds_list_size( h_collision_list ) > 0 {
- _n = x_target;
- for ( i = 0; i < ds_list_size( h_collision_list ); i++ ) {
- instance_activate_object( ds_list_find_value( h_collision_list, i ) );
- _n2 = ds_list_find_value( h_collision_list, i ).bbox_right;
- if _n2 > _n _n = _n2;
- }
- x_target = _n;
- }
- }
- if x_speed > 0 and bool( collision_rectangle( bbox_right + x_slop, bbox_top, bbox_left + x_slop + x_speed, bbox_bottom, tmp_block, 0, 1 ) ) {
- _c = 0;
- while _c != noone {
- _c = collision_rectangle( bbox_right + x_slop, bbox_top, bbox_left + x_slop + x_speed, bbox_bottom, tmp_block, 0, 1 );
- if _c != noone {
- ds_list_add( h_collision_list, _c );
- instance_deactivate_object( _c )
- }
- }
- //truncate x_speed to nearest obstacle if needed
- if ds_list_size( h_collision_list ) > 0 {
- _n = x_target;
- for ( i = 0; i < ds_list_size( h_collision_list ); i++ ) {
- instance_activate_object( ds_list_find_value( h_collision_list, i ) );
- _n2 = ds_list_find_value( h_collision_list, i ).bbox_left;
- if _n2 < _n _n = _n2;
- }
- x_target = _n;
- }
- }
- //resolve horizontal movement
- x = x_target div 1;
- x_slop = x_target mod 1;
- if y_speed < 0 and bool( collision_rectangle( bbox_right, bbox_top + y_slop + y_speed, bbox_left, bbox_top + y_slop, tmp_block, 0, 1 ) ) {
- _c = 0;
- while _c != noone {
- _c = collision_rectangle( bbox_right, bbox_top + y_slop + y_speed, bbox_left, bbox_top + y_slop, tmp_block, 0, 1 );
- if _c != noone {
- ds_list_add( v_collision_list, _c );
- instance_deactivate_object( _c );
- }
- }
- if ds_list_size( v_collision_list ) > 0 {
- _n = y_target;
- for ( i = 0; i < ds_list_size( v_collision_list ); i++; ) {
- instance_activate_object( ds_list_find_value( v_collision_list, i ) );
- _n2 = ds_list_find_value( h_collision_list, i ).bbox_bottom;
- if _n2 > _n _n = _n2;
- }
- y_target = _n;
- }
- }
- if y_speed > 0 and bool( collision_rectangle( bbox_right, bbox_bottom + y_slop, bbox_left, bbox_bottom + y_slop + y_speed, tmp_block, 0, 1 ) ) {
- _c = 0;
- while _c != noone {
- _c = collision_rectangle( bbox_right, bbox_bottom + y_slop, bbox_left, bbox_bottom + y_slop + y_speed, tmp_block, 0, 1 );
- if _c != noone {
- ds_list_add( v_collision_list, _c );
- instance_deactivate_object( _c );
- }
- }
- while _c != noone {
- _c = collision_rectangle( bbox_right, bbox_bottom + y_slop, bbox_left, bbox_bottom + y_slop + y_speed, tmp_platform, 0, 1 );
- if _c != noone {
- ds_list_add( v_collision_list, _c );
- instance_deactivate_object( _c );
- }
- }
- if ds_list_size( v_collision_list ) > 0 {
- _n = y_target;
- for ( i = 0; i < ds_list_size( v_collision_list ); i++; ) {
- instance_activate_object( ds_list_find_value( v_collision_list, i ) );
- _n2 = ds_list_find_value( h_collision_list, i ).bbox_bottom;
- if _n2 < _n _n = _n2;
- }
- y_target = _n;
- }
- }
- //resolve vertical movement
- y = y_target div 1;
- y_slop = y_target mod 1;
- //memory cleanup
- ds_list_destroy( h_collision_list );
- ds_list_destroy( v_collision_list );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement