Beispiel #1
0
/**
 * \brief Get the position of the level name.
 * \param camera_rect The rectangle of the camera. 
 */
bear::universe::position_type rp::util::get_level_name_position
( const bear::universe::rectangle_type & camera_rect)
{
  return 
    bear::universe::position_type
    ( camera_rect.left() + camera_rect.size().x / 2,
      camera_rect.bottom() + 0.9 * camera_rect.size().y );
} // get_level_name_position()
Beispiel #2
0
/**
 * \brief Align one box with another.
 * \param this_box The box to which we will align the other.
 * \param that_old_pos The position from where comes the other box.
 * \param that_new_box (in/out) The box we will align.
 * \remark This method does nothing.
 */
void bear::universe::alignment::align
( const bear::universe::rectangle_type& this_box,
  const bear::universe::position_type& that_old_pos,
  bear::universe::rectangle_type& that_new_box ) const
{
    that_new_box.bottom_left( that_old_pos );
} // alignment::align()
/**
 * \brief Update the content of the box.
 * \param camera_box The box of the camera in the level.
 * \param layer_size The size of the layer.
 */
void bear::item_information_layer::info_box::update
( const bear::universe::rectangle_type& camera_box,
  const claw::math::coordinate_2d<unsigned int>& layer_size)
{
  claw::math::coordinate_2d<double> ratio
    ( camera_box.size().x / layer_size.x,
      camera_box.size().y / layer_size.y );

  if ( m_item != NULL )
    {
      bear::universe::position_type pos;
      pos.x = (m_item->get_right() - camera_box.left())/ratio.x + m_delta.x;
      pos.y = (m_item->get_top() - camera_box.bottom())/ratio.y + m_delta.y;
      m_text.set_position( pos );
    }
  else
    m_text.set_text("Invalid handle.");
} // item_information_layer::info_box::update()
/**
 * \brief Adjust the distance between the player and the arrow.
 * \param glob The level globals in which we load the media.
 * \param visible_area The visible part of the layer.
 */
void ptb::player_arrows_layer::player_data::adjust_distance
( bear::engine::level_globals& glob,
  const bear::universe::rectangle_type& visible_area )
{
  claw::math::coordinate_2d<double> ratio
    ( visible_area.size().x / m_screen_size.x,
      visible_area.size().y / m_screen_size.y );

  bear::universe::position_type relative_position;
  relative_position.x = visible_area.left() +
    ( m_position.x + m_arrow.width() / 2 ) * ratio.x;

  relative_position.y = visible_area.bottom() +
    ( m_screen_size.y - m_position.y - m_arrow.height() / 2 ) * ratio.y;

  bear::universe::speed_type vect
    (m_player.get_center_of_mass(), relative_position);
  unsigned int dist = (unsigned int)vect.length() / 100;

  const bear::universe::rectangle_type box = m_player.get_bounding_box();
  bear::visual::font f = glob.get_font("font/Fava-black.ttf", 30);
  if ( box.intersects( visible_area ) )
    m_distance.create(f, "");
  else
    {
      std::ostringstream oss;
      oss << dist+1;
      m_distance.create(f, oss.str());
      m_distance->set_intensity(1, 0.8, 0);
    }

  m_distance_text_position = m_position;

  bear::universe::position_type gap;
  gap.x = cos(m_arrow.get_angle()) * 50;
  gap.y = sin(m_arrow.get_angle()) * 50;

  m_distance_text_position.x +=
    m_arrow.width() / 2 - gap.x - m_distance.get_width() / 2;
  m_distance_text_position.y +=
    m_arrow.height() / 2 - gap.y - m_distance.get_height() / 2;
} // player_arrows_layer::player_data::adjust_distance()
/**
 * \brief Show the informations of an item, given a position.
 * \param pos The position where the item is searched.
 * \param camera_box The box of the camera in the level.
 */
bool bear::item_information_layer::show_item
( const bear::universe::position_type& pos,
  const bear::universe::rectangle_type& camera_box )
{
  claw::math::coordinate_2d<double> ratio
    ( camera_box.size().x / get_size().x,
      camera_box.size().y / get_size().y );

  bear::universe::position_type r_pos;
  r_pos.x = pos.x*ratio.x + camera_box.left();
  r_pos.y = pos.y*ratio.y + camera_box.bottom();

  bear::universe::physical_item* item = find_item(r_pos);

  if (item != NULL)
    {
      m_info_box.push_front
      ( new info_box
        (*item, get_level_globals().get_font("font/fixed_white-7x12.fnt",12)) );
    }
  return item != NULL;
} // item_information_layer::show_item()
/**
 * \brief Adjust the position of the arrow.
 * \param visible_area The visible part of the layer.
 */
void ptb::player_arrows_layer::player_data::adjust_position
( const bear::universe::rectangle_type& visible_area )
{
  bear::universe::position_type result;

  const bear::universe::position_type pos_player
    ( m_player.get_center_of_mass() );
  const bear::universe::position_type center
    ( visible_area.bottom_left() + visible_area.size() / 2 );

  claw::math::vector_2d<double> vect(center, pos_player);
  vect.normalize();

  // intersection betwwen line and ellipse
  double a = ( m_screen_size.x / 2 ) - 50;
  double b = ( m_screen_size.y / 2 ) - 50;
  double k = ( a*a*b*b ) / ( b*b*vect.x*vect.x + a*a*vect.y*vect.y);
  k = sqrt(k);

  m_position.x = m_screen_size.x / 2 + k*vect.x - m_arrow.get_size().x / 2;
  m_position.y = m_screen_size.y / 2 + k*vect.y - m_arrow.get_size().y / 2;
} // player_arrows_layer::player_data::adjust_position()
Beispiel #7
0
/**
 * \brief Get the position of the medal.
 * \param camera_rect The rectangle of the camera. 
 */
bear::universe::position_type rp::util::get_medal_position
( const bear::universe::rectangle_type & camera_rect)
{
  return 
#if 0
    // at right
    bear::universe::position_type
    ( camera_rect.left() + 0.85 * camera_rect.size().x,
      camera_rect.bottom() + 0.19 * camera_rect.size().y );
#else
  // at left
  bear::universe::position_type
    ( camera_rect.left() + 0.15 * camera_rect.size().x,
      camera_rect.bottom() + 0.19 * camera_rect.size().y );
#endif

} // get_medal_position()
/**
 * \brief Set the position and the angle of the arrow.
 * \param glob The level globals in which we load the media.
 * \param visible_area The visible part of the level.
 */
void ptb::player_arrows_layer::player_data::adjust_arrow
( bear::engine::level_globals& glob,
  const bear::universe::rectangle_type& visible_area )
{
  m_visible = false;

  if ( (m_player != NULL) && !m_player.is_a_marionette() )
    {
      const bear::universe::position_type center =
        m_player.get_center_of_mass();

      if( ( center.x < visible_area.left() ) ||
          ( center.x > visible_area.left() + visible_area.size().x ) ||
          ( center.y < visible_area.bottom() ) ||
          ( center.y > visible_area.bottom() + visible_area.size().y ) )
        {
          adjust_position( visible_area );
          adjust_angle( visible_area );
          adjust_distance(glob, visible_area );

          m_visible = true;
        }
    }
} // player_arrows_layer::player_data::adjust_arrow()
/**
 * \brief Adjust the angle of the arrow.
 * \param visible_area The visible part of the layer.
 */
void ptb::player_arrows_layer::player_data::adjust_angle
( const bear::universe::rectangle_type& visible_area )
{
  claw::math::coordinate_2d<double> ratio
    ( visible_area.size().x / m_screen_size.x,
      visible_area.size().y / m_screen_size.y );

  bear::universe::position_type relative_position;
  relative_position.x = visible_area.left() +
    ( m_position.x + m_arrow.width() / 2 ) * ratio.x;

  relative_position.y = visible_area.bottom() +
    ( m_position.y + m_arrow.height() / 2 ) * ratio.y;

  bear::universe::speed_type v =
    m_player.get_center_of_mass() - relative_position;

  v.normalize();

  if ( v.y <= 0 )
    m_arrow.set_angle( -acos(v.x) );
  else
    m_arrow.set_angle( acos(v.x) );
} // player_arrows_layer::player_data::adjust_angle()