static void iterate_bat_laser(Game *game) { gboolean kill_laser = FALSE; gint bat_center; Block *block; GList *children; Entity *laser; children = game->bat->children; while(children) { laser = (Entity *) children->data; children = g_list_next(children); laser->geometry.y1 -= LASER_SPEED; laser->geometry.y2 -= LASER_SPEED; if(laser->geometry.y1 < 0) { kill_laser = TRUE; } else if((block = find_block_from_position(game, laser))) { if(block->type != BLOCK_DEAD) { hit_block(game, block); kill_laser = TRUE; } } if(kill_laser) { remove_child_laser(game->bat, laser); } else { update_canvas_position(laser); } } if(game->fire1_pressed && game->bat->num_lasers_allowed > game->bat->num_lasers ) { bat_center = game->bat->geometry.x1 + game->bat->width / 2; laser = g_malloc(sizeof(Entity)); laser->geometry.x1 = bat_center - LASER_WIDTH / 2; laser->geometry.x2 = laser->geometry.x1 + LASER_WIDTH; laser->geometry.y2 = game->bat->geometry.y1; laser->geometry.y1 = laser->geometry.y2 - LASER_HEIGHT; laser->animation = get_animation(ANIM_LASER); add_to_canvas(laser); game->bat->num_lasers++; game->bat->children = g_list_prepend(game->bat->children, laser); } }
void update_gamestate(Outbreak * outbreak) { if (!outbreak->paused) { object_update_position(outbreak->player); if (object_offscreen(outbreak->player)) { set_object_x(outbreak->player, (object_direction_x(outbreak->player) == DIRECTION_LEFT) ? 0 : SCREEN_WIDTH - object_width(outbreak->player)); } if (ball_magnetized(outbreak->ball)) { set_object_x(outbreak->ball, object_x(outbreak->player) + (object_width(outbreak->player) - object_width(outbreak->ball)) / 2.0f); } object_update_x(outbreak->ball); if (object_offscreen(outbreak->ball)) { set_object_x(outbreak->ball, (object_direction_x(outbreak->ball) == DIRECTION_LEFT) ? 0 : SCREEN_WIDTH - object_width(outbreak->ball)); object_bounce_x(outbreak->ball); } else if (object_collision(outbreak->player, outbreak->ball)) { object_rollback_x(outbreak->ball); object_bounce_x(outbreak->ball); } else { int i; for (i = 0; i < outbreak->num_blocks; i++) { if (object_collision(outbreak->ball, outbreak->blocks[i])) { hit_block(outbreak->blocks[i]); if (outbreak->blocks[i]->health == 0) { remove_block(outbreak, outbreak->blocks[i]); } object_rollback_x(outbreak->ball); object_bounce_x(outbreak->ball); break; } } } object_update_y(outbreak->ball); if (object_y(outbreak->ball) >= SCREEN_HEIGHT) { outbreak->quit = TRUE; } else if (object_y(outbreak->ball) < 0) { set_object_y(outbreak->ball, 0); object_bounce_y(outbreak->ball); } else if (object_collision(outbreak->player, outbreak->ball)) { object_rollback_y(outbreak->ball); object_bounce_y(outbreak->ball); set_object_angle(outbreak->ball, object_angle(outbreak->ball) - ((object_x(outbreak->ball) - object_x(outbreak->player)) - (object_width(outbreak->player) + object_width(outbreak->ball)) / 2.0f) * PADDLE_CURVINESS); } else { int i; for (i = 0; i < outbreak->num_blocks; i++) { if (object_collision(outbreak->ball, outbreak->blocks[i])) { hit_block(outbreak->blocks[i]); if (outbreak->blocks[i]->health == 0) { remove_block(outbreak, outbreak->blocks[i]); } object_rollback_y(outbreak->ball); object_bounce_y(outbreak->ball); break; } } } if (!ball_magnetized(outbreak->ball)) { set_object_speed(outbreak->ball, object_speed(outbreak->ball) + BALL_ACCELERATION); } } }