4
Copyright (C) 2005-2009 Julien Jorge, Sebastien Angibaud
4
Copyright (C) 2005-2010 Julien Jorge, Sebastien Angibaud
6
6
This program is free software; you can redistribute it and/or modify it
7
7
under the terms of the GNU General Public License as published by the
27
27
* \author S�bastien Angibaud
29
29
#include "ptb/item/air_bubble.hpp"
30
#include "ptb/item/plee/plee.hpp"
30
#include "ptb/player.hpp"
31
31
#include "engine/export.hpp"
33
33
#include "universe/forced_movement/forced_translation.hpp"
69
if ( get_width() < m_max_size )
71
bear::universe::position_type center = get_center_of_mass();
72
set_width(get_width() + 0.2 );
73
set_height(get_height() + 0.2 );
74
set_density(0.9 - 0.3*(get_width() - s_min_size)/
75
( s_max_size-s_min_size));
76
set_center_of_mass(center);
79
m_sprite.set_size( get_size() );
68
update_size(elapsed_time);
81
70
if ( !is_only_in_environment(bear::universe::water_environment) )
74
double f = (double)(get_mass() * 2000.0 * rand() / RAND_MAX) -
76
add_internal_force(bear::universe::force_type(f,0));
84
80
} // air_bubble::progress()
95
91
( bear::engine::scene_visual
96
( get_top_left(), m_sprite, get_z_position() ) );
92
( get_bottom_left(), m_sprite, get_z_position() ) );
97
93
} // air_bubble::get_visual()
99
95
/*----------------------------------------------------------------------------*/
101
* \brief Initialize the layer.
97
* \brief Pre-cache the datas used by the item.
99
void ptb::air_bubble::pre_cache()
101
get_level_globals().load_image("gfx/bubble.png");
102
} // air_bubble::pre_cache()
104
/*----------------------------------------------------------------------------*/
106
* \brief Initialize the item.
103
108
void ptb::air_bubble::build()
105
bear::engine::level_globals& glob = get_level_globals();
107
const bear::visual::image& im_resource = glob.get_image("gfx/bubble.png");
111
( im_resource, claw::math::rectangle<unsigned int>( 0, 0, 32, 32 ) );
112
m_sprite = get_level_globals().auto_sprite("gfx/bubble.png", "bubble");
115
m_sprite.set_intensity(0.8,0.9,0.4);
117
m_sprite.set_intensity(1,1,1);
119
m_sprite.set_size( get_size() );
112
120
} // air_bubble::build()
114
122
/*----------------------------------------------------------------------------*/
123
131
if ( get_width() >= (unsigned int)s_min_size )
125
plee* other = dynamic_cast<plee*>(&that);
133
player* other = dynamic_cast<player*>(&that);
127
135
if (other != NULL)
129
other->receive_oxygen(m_oxygen);
137
bear::engine::model_mark_placement m;
139
if ( other->get_mark_placement("mouth",m) )
140
if ( get_bounding_box().includes( m.get_position()) )
142
other->receive_oxygen(m_oxygen);
134
148
} // air_bubble::collision()
136
150
/*---------------------------------------------------------------------------*/
138
* \brief Set the oxygen vallue.
152
* \brief Set the oxygen value.
139
153
* \param oxygen The new oxygen value.
141
155
void ptb::air_bubble::set_oxygen( double oxygen )
145
159
if ( m_oxygen == 0 )
147
161
// a decorative bubble;
162
m_max_size = s_min_size / 2;
149
163
set_density(0.85);
153
if ( m_oxygen >= s_oxygen_in_max_size )
167
if ( std::abs(m_oxygen) >= s_oxygen_in_max_size )
154
168
m_max_size = s_max_size;
156
170
m_max_size = s_min_size +
157
(m_oxygen * ( s_max_size - s_min_size ) ) / s_oxygen_in_max_size;
159
set_density(0.9 - 0.3*(m_max_size - s_min_size)/
160
( s_max_size-s_min_size));
172
( s_max_size - s_min_size) / s_oxygen_in_max_size;
162
174
} // air_bubble::set_oxygen()
178
190
void ptb::air_bubble::leaves_active_region()
192
super::leaves_active_region();
181
195
} // ptb::air_bubble::leaves_active_region()
197
/*---------------------------------------------------------------------------*/
199
* \brief Update the size of the bubble according to its oxygen.
200
* \param elapsed_time Elapsed time since the last call.
202
void ptb::air_bubble::update_size( bear::universe::time_type elapsed_time )
204
if ( get_width() < m_max_size )
206
const bear::universe::position_type center( get_center_of_mass() );
207
set_width( get_width() + 13 * elapsed_time );
208
set_height(get_height() + 13 * elapsed_time );
210
( 0.9 - 0.3 * (get_width() - s_min_size) / (s_max_size - s_min_size) );
211
set_center_of_mass(center);
214
m_sprite.set_size( get_size() );
215
} // air_bubble::update_size()