void duck_set_state(struct duck *duck, int state, float time) { duck->state = state; const struct sprite_class *class = &duck_classes[state]; *((struct sprite_class *) duck->sprite) = *class; sprite_set_animation(duck->sprite, &duck_animations[state], time); }
static void collide(struct sprite *this_sprite, struct sprite *other_sprite, int x, int y) { if (this_sprite->state == 0) { this_sprite->state = 1; sprite_set_animation(this_sprite, dissolve); } }
static void update(sprite_t *s) { float v[2],x,pull[2]; mech_sprite_t *ms = (mech_sprite_t *)s; sprite_get_vel(s,v); if (!(s->state & PLANE_CRASHING)) { if (s->state & PLANE_ACCELERATING) { vset(pull,mech_heading(ms)); vrot(pull,-16); /* maybe the angle should depend on up/down */ vmadd(ms->lin_impulse,engine_strength,pull); } if (s->state & PLANE_UP) ms->air_rotate = -turn_amount; else if (s->state & PLANE_DOWN) ms->air_rotate = turn_amount; else ms->air_rotate = 0; if (ms->damage >= hitpoints) { s->state |= PLANE_CRASHING; if (!(s->owner->schrodinger)){ sprite_set_animation(s,crashing[s->owner->id_in_team]); }else{ sprite_set_animation(s,crashing[MAXPLAYERINTEAMS]); } s->owner->lastEnnemi->points+=crash_point; create_effect(&fire,s->x,s->y); sprite_alarm(7000,s,SIGNAL_KILL,0); } } mech_update(ms); }
void init_duck(struct duck *duck, int state, double x, double y, double v_x, double v_y, int z, float time) { duck->state = state; duck->world_x = x; duck->world_y = y; duck->world_v_x = v_x; duck->world_v_y = v_y; struct sprite *sprite = create_sprite(&duck_classes[state], world_to_screen_x(x), world_to_screen_y(y), z, 0); sprite_set_animation(sprite, &duck_animations[state], time); duck->sprite = sprite; elist_link(&duck->link, &duck->link); }