void cEnemy::Update_Late(void) { if (m_state == STA_OBJ_LINKED) { Move(pPlayer->m_velx, pPlayer->m_vely); m_massive_type = MASS_MASSIVE; cObjectCollisionType* col_list = Collision_Check(&m_col_rect); Add_Collisions(col_list, 1); delete col_list; Handle_Collisions(); m_massive_type = MASS_PASSIVE; } }
void cMovingSprite :: Col_Move( float move_x, float move_y, bool real /* = 0 */, bool force /* = 0 */, bool check_on_ground /* = 1 */ ) { // no need to move if( Is_Float_Equal( move_x, 0.0f ) && Is_Float_Equal( move_y, 0.0f ) ) { return; } // invalid collision rect if( Is_Float_Equal( m_col_rect.m_w, 0.0f ) || Is_Float_Equal( m_col_rect.m_h, 0.0f ) ) { return; } // use speedfactor if( !real ) { move_x *= pFramerate->m_speed_factor; move_y *= pFramerate->m_speed_factor; } // check for collisions if( !force ) { // get all possible colliding items GL_rect complete_rect = m_col_rect; if( move_x > 0.0f ) { complete_rect.m_w += move_x; } else { complete_rect.m_x += move_x; complete_rect.m_w -= move_x; } if( move_y > 0.0f ) { complete_rect.m_h += move_y; } else { complete_rect.m_y += move_y; complete_rect.m_h -= move_y; } cSprite_List sprite_list; pActive_Sprite_Manager->Get_Colliding_Objects( sprite_list, complete_rect, 1, this ); // step size float step_size_x = move_x; float step_size_y = move_y; // check if object collision rect is smaller as the position check size if( step_size_x > m_col_rect.m_w ) { step_size_x = m_col_rect.m_w; } else if( step_size_x < -m_col_rect.m_w ) { step_size_x = -m_col_rect.m_w; } if( step_size_y > m_col_rect.m_h ) { step_size_y = m_col_rect.m_h; } else if( step_size_y < -m_col_rect.m_h ) { step_size_y = -m_col_rect.m_h; } float final_pos_x = m_pos_x + move_x; float final_pos_y = m_pos_y + move_y; // move in big steps cObjectCollisionType *col_list = Col_Move_in_Steps( move_x, move_y, step_size_x, step_size_y, final_pos_x, final_pos_y, sprite_list, 1 ); // if a collision is found enter pixel checking if( col_list && col_list->size() ) { // change to pixel checking if( step_size_x < -1.0f ) { step_size_x = -1.0f; } else if( step_size_x > 1.0f ) { step_size_x = 1.0f; } if( step_size_y < -1.0f ) { step_size_y = -1.0f; } else if( step_size_y > 1.0f ) { step_size_y = 1.0f; } delete col_list; col_list = Col_Move_in_Steps( move_x, move_y, step_size_x, step_size_y, final_pos_x, final_pos_y, sprite_list ); Add_Collisions( col_list, 1 ); } if( col_list ) { delete col_list; } } // don't check for collisions else { m_pos_x += move_x; m_pos_y += move_y; Update_Position_Rect(); } // if check on ground if( check_on_ground ) { Check_on_Ground(); } // check/handle if moved out of level rect Check_Out_Of_Level_Hor( move_x, 1 ); Check_Out_Of_Level_Ver( move_y, 1 ); }