/* 위치와 현재의 shield 애니메이션을 업데이트한다. */ void update_shield(player_t *p) { actor_t *sh = p->shield, *act = p->actor; v2d_t off = v2d_new(0,0); sh->position = v2d_add(act->position, v2d_rotate(off, -old_school_angle(act->angle))); switch(p->shield_type) { case SH_SHIELD: actor_change_animation(sh, sprite_get_animation("SD_SHIELD", 0)); break; case SH_FIRESHIELD: actor_change_animation(sh, sprite_get_animation("SD_FIRESHIELD", 0)); break; case SH_THUNDERSHIELD: actor_change_animation(sh, sprite_get_animation("SD_THUNDERSHIELD", 0)); break; case SH_WATERSHIELD: actor_change_animation(sh, sprite_get_animation("SD_WATERSHIELD", 0)); break; case SH_ACIDSHIELD: actor_change_animation(sh, sprite_get_animation("SD_ACIDSHIELD", 0)); break; case SH_WINDSHIELD: actor_change_animation(sh, sprite_get_animation("SD_WINDSHIELD", 0)); break; } }
void update(objectmachine_t *obj, player_t **team, int team_size, brick_list_t *brick_list, item_list_t *item_list, object_list_t *object_list) { objectdecorator_t *dec = (objectdecorator_t*)obj; objectdecorator_enemy_t *me = (objectdecorator_enemy_t*)obj; objectmachine_t *decorated_machine = dec->decorated_machine; object_t *object = obj->get_object_instance(obj); int i, score; score = (int)expression_evaluate(me->score); /* player x object collision */ for(i=0; i<team_size; i++) { player_t *player = team[i]; if(actor_pixelperfect_collision(object->actor, player->actor)) { if(player_is_attacking(player) || player->invincible) { /* I've been defeated */ player_bounce(player, object->actor); level_add_to_score(score); level_create_item(IT_EXPLOSION, v2d_add(object->actor->position, v2d_new(0,-15))); level_create_animal(object->actor->position); sound_play( soundfactory_get("destroy") ); object->state = ES_DEAD; } else { /* The player has been hit by me */ player_hit(player, object->actor); } } } decorated_machine->update(decorated_machine, team, team_size, brick_list, item_list, object_list); }
void update(objectmachine_t *obj, player_t **team, int team_size, brick_list_t *brick_list, item_list_t *item_list, object_list_t *object_list) { objectdecorator_t *dec = (objectdecorator_t*)obj; objectmachine_t *decorated_machine = dec->decorated_machine; objectdecorator_setplayerposition_t *me = (objectdecorator_setplayerposition_t*)obj; object_t *object = obj->get_object_instance(obj); player_t *player = enemy_get_observed_player(object); v2d_t offset = v2d_new(expression_evaluate(me->offset_x), expression_evaluate(me->offset_y)); player->actor->position = v2d_add(object->actor->position, offset); player->disable_wall = PLAYER_WALL_NONE; decorated_machine->update(decorated_machine, team, team_size, brick_list, item_list, object_list); }
/* private strategies */ void createchild_strategy(objectdecorator_children_t *me, player_t **team, int team_size, brick_list_t *brick_list, item_list_t *item_list, object_list_t *object_list) { objectmachine_t *obj = (objectmachine_t*)me; object_t *object = obj->get_object_instance(obj); object_t *child; v2d_t offset; offset.x = expression_evaluate(me->offset_x); offset.y = expression_evaluate(me->offset_y); child = level_create_enemy(me->object_name, v2d_add(object->actor->position, offset)); if(child != NULL) { enemy_add_child(object, me->child_name, child); enemy_update(child, team, team_size, brick_list, item_list, object_list); /* important to exchange data between objects */ nanocalcext_set_target_object(object, brick_list, item_list, object_list); /* restore nanocalc's target object */ } }
/* * player_hit() * player가 공격한다. collectibles가 없다면 죽는다. */ void player_hit(player_t *player, actor_t *hazard) { int w = image_width(actor_image(hazard))/2, h = image_height(actor_image(hazard))/2; v2d_t hazard_centre = v2d_add(v2d_subtract(hazard->position, hazard->hot_spot), v2d_new(w/2, h/2)); if(player->invincible || physicsactor_get_state(player->pa) == PAS_GETTINGHIT || player->blinking || player_is_dying(player)) return; if(player_get_collectibles() > 0 || player->shield_type != SH_NONE) { player->actor->speed.x = 120.0f * sign(player->actor->position.x - hazard_centre.x); player->actor->speed.y = -240.0f; player->actor->position.y -= 2; /* bugfix */ player->pa_old_state = physicsactor_get_state(player->pa); physicsactor_hit(player->pa); if(player->shield_type != SH_NONE) { player->shield_type = SH_NONE; sound_play( soundfactory_get("damaged") ); } else if(!player->disable_collectible_loss) { float a = 101.25f, spd = 240.0f*2; int i, r = min(32, player_get_collectibles()); item_t *b; player_set_collectibles(0); /* collectibles 생성 */ for(i=0; i<r; i++) { b = level_create_item(IT_BOUNCINGRING, player->actor->position); bouncingcollectible_set_speed(b, v2d_new(-sin(a*PI/180.0f)*spd*(1-2*(i%2)), cos(a*PI/180.0f)*spd)); a += 22.5f * (i%2); if(i%16 == 0) { spd /= 2.0f; a = 101.25f; } } sound_play( soundfactory_get("collectible loss") ); } else sound_play( soundfactory_get("damaged") ); } else player_kill(player); }
void proj_update_shell(Entity *proj) { V2D temp; proj->body->velocity.x -= 1; proj->body->velocity.y = 0.33; v2d_set( temp, sin(DEG2RAD * (proj->body->rotation.x)) * g_deltatime, -cos(DEG2RAD * (proj->body->rotation.x)) * g_deltatime ); v2d_add( proj->body->position, proj->body->position, temp ); }
/* * player_bounce() * player의 반동을 제어하는 함수 */ void player_bounce(player_t *player, actor_t *hazard) { int w = image_width(actor_image(hazard))/2, h = image_height(actor_image(hazard))/2; v2d_t hazard_centre = v2d_add(v2d_subtract(hazard->position, hazard->hot_spot), v2d_new(w/2, h/2)); actor_t *act = player->actor; if(physicsactor_is_in_the_air(player->pa)) { if(act->position.y <= hazard_centre.y && act->speed.y > 0.0f) { if(input_button_down(act->input, IB_FIRE1) || physicsactor_get_state(player->pa) == PAS_ROLLING) act->speed.y *= -1.0f; else act->speed.y = 4 * max(-60.0f, -60.0f * act->speed.y); player->pa_old_state = physicsactor_get_state(player->pa); physicsactor_bounce(player->pa); } else act->speed.y -= 4 * 60.0f * sign(act->speed.y); } }
void update(objectmachine_t *obj, player_t **team, int team_size, brick_list_t *brick_list, item_list_t *item_list, object_list_t *object_list) { objectdecorator_t *dec = (objectdecorator_t*)obj; objectmachine_t *decorated_machine = dec->decorated_machine; objectdecorator_textout_t *me = (objectdecorator_textout_t*)obj; object_t *object = obj->get_object_instance(obj); symboltable_t *st = objectvm_get_symbol_table(object->vm); char *processed_text; int start, length; float wpx; v2d_t pos; /* 문자열의 범위를 계산한다 ( clip()할 필요가 없다 ) */ start = (int)expression_evaluate(me->index_of_first_char); length = (int)expression_evaluate(me->length); /* 글꼴 구성 */ font_use_substring(me->fnt, start, length); font_set_width(me->fnt, (int)expression_evaluate(me->max_width)); /* 글꼴 텍스트 */ processed_text = nanocalc_interpolate_string(me->text, st); font_set_text(me->fnt, "%s", processed_text); free(processed_text); /* symbol table tricks */ symboltable_set(st, "$_STRLEN", tagged_strlen(font_get_text(me->fnt))); /* $_STRLEN의 텍스트 길이를 저장한다. */ /* 글꼴 위치 */ pos = v2d_new(expression_evaluate(me->xpos), expression_evaluate(me->ypos)); wpx = font_get_textsize(me->fnt).x; switch(me->style) { case TEXTOUT_LEFT: break; case TEXTOUT_CENTRE: pos.x -= wpx/2; break; case TEXTOUT_RIGHT: pos.x -= wpx; break; } font_set_position(me->fnt, v2d_add(object->actor->position, pos)); /* done! */ decorated_machine->update(decorated_machine, team, team_size, brick_list, item_list, object_list); }