153 |
protected: |
protected: |
154 |
BasicBall(const char *kind, double radius, double mass); |
BasicBall(const char *kind, double radius, double mass); |
155 |
|
|
156 |
enum State { NORMAL, SHATTERING, DROWNING, FALLING, JUMPING, DEAD }; |
enum State { |
157 |
|
NORMAL, |
158 |
|
SHATTERING, |
159 |
|
DROWNING, |
160 |
|
FALLING, |
161 |
|
JUMPING, |
162 |
|
DEAD, |
163 |
|
APPEARING, |
164 |
|
DISAPPEARING, |
165 |
|
}; |
166 |
State state; |
State state; |
167 |
|
|
168 |
void set_model_cb(const string &m) { |
void set_model_cb(const string &m) { |
175 |
void animcb(); |
void animcb(); |
176 |
|
|
177 |
// Actor interface. |
// Actor interface. |
178 |
|
void on_creation(const px::V3 &p) { |
179 |
|
Actor::on_creation(p); |
180 |
|
change_state(APPEARING); |
181 |
|
} |
182 |
|
|
183 |
bool is_dead() { return state == DEAD; } |
bool is_dead() { return state == DEAD; } |
184 |
bool is_flying() { return state == JUMPING; } |
bool is_flying() { return state == JUMPING; } |
185 |
|
bool can_drop_items() { return state==NORMAL || state==JUMPING; } |
186 |
|
bool can_pickup_items() { return state==NORMAL; } |
187 |
|
|
188 |
// Object interface. |
// Object interface. |
189 |
void message(const string &m, const Value &); |
void message(const string &m, const Value &); |
210 |
change_state(DROWNING); |
change_state(DROWNING); |
211 |
else if (m == "jump") |
else if (m == "jump") |
212 |
change_state(JUMPING); |
change_state(JUMPING); |
213 |
|
else if (m == "appear") |
214 |
|
change_state(APPEARING); |
215 |
|
else if (m == "disappear") |
216 |
|
change_state(DISAPPEARING); |
217 |
} |
} |
218 |
} |
} |
219 |
|
|
238 |
set_model(kind); |
set_model(kind); |
239 |
change_state(NORMAL); |
change_state(NORMAL); |
240 |
break; |
break; |
241 |
|
case APPEARING: |
242 |
|
set_model(kind); |
243 |
|
change_state(NORMAL); |
244 |
|
break; |
245 |
|
case DISAPPEARING: |
246 |
|
set_model("ringanim"); |
247 |
|
break; |
248 |
default: |
default: |
249 |
break; |
break; |
250 |
} |
} |
280 |
sound::PlaySound("boink"); |
sound::PlaySound("boink"); |
281 |
set_model_cb(kind+"-jump"); |
set_model_cb(kind+"-jump"); |
282 |
break; |
break; |
283 |
|
case APPEARING: |
284 |
|
set_model_cb(kind+"-appear"); |
285 |
|
break; |
286 |
|
case DISAPPEARING: |
287 |
|
world::GrabActor(this); |
288 |
|
set_model_cb(kind+"-drown"); |
289 |
|
break; |
290 |
} |
} |
291 |
state = newstate; |
state = newstate; |
292 |
} |
} |