コード例 #1
0
ファイル: enemy.cpp プロジェクト: chrislee1018/smcios
 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;
     }
 }
コード例 #2
0
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 );
}