예제 #1
0
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);
	}
}
예제 #2
0
파일: outbreak.c 프로젝트: yjerem/outbreak
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);
    }
  }
}