/
sibiskus
/
Drive_Studio
Обзор
Документация
Войти
/
sibiskus
/
Drive_Studio
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
controller/spawn_manager.py
91 строка
3 KB
Snezha
ещё раз прошлась по всем файлам, где-то дописала вот эти мини документации, чтобы быстрее ориентироваться по проекту
23 июн 2026, 03:06
23 июн 2026, 03:06
12ea40b
Код
Авторство
О чём код?
import random import config from models.bot_car import Truck, SimpleCar, SportsCar from models.traffic import Coin, FuelCanister OBSTACLE_CLASSES_BY_NAME = { "truck": Truck, "car": SimpleCar, "sports_car": SportsCar } class SpawnManager: def __init__(self, road): self.road = road def get_occupied_lanes(self, obstacles, coins, fuels): """Определяет полосы, занятые объектами в зоне появления""" occupied = set() for obj in obstacles + coins + fuels: if obj.y < config.PLAYER_HEIGHT * 2: for lane in range(config.LANES_COUNT): lane_center = self.road.get_lane_center(lane) obj_center_x = obj.x + (obj.width // 2) if abs(obj_center_x - lane_center) < 5: occupied.add(lane) return occupied def get_random_free_lane(self, obstacles, coins, fuels): """Возвращает случайную свободную полосу для появления объекта""" occupied_lanes = self.get_occupied_lanes(obstacles, coins, fuels) available_lanes = [ lane for lane in range(config.LANES_COUNT) if lane not in occupied_lanes ] if not available_lanes: return None return random.choice(available_lanes) def get_spawn_x(self, lane, object_width): """Вычисляет координату X для объекта по центру выбранной полосы""" lane_center_x = self.road.get_lane_center(lane) return lane_center_x - (object_width // 2) def spawn_obstacle(self, obstacles, coins, fuels): """Создает случайное препятствие в свободной полосе""" random_lane = self.get_random_free_lane(obstacles, coins, fuels) if random_lane is None: return car_names = [name for name, weight in config.OBSTACLE_SPAWN_WEIGHTS] weights = [weight for name, weight in config.OBSTACLE_SPAWN_WEIGHTS] chosen_name = random.choices(car_names, weights=weights, k=1)[0] chosen_class = OBSTACLE_CLASSES_BY_NAME[chosen_name] obstacle_x = self.get_spawn_x(random_lane, config.PLAYER_WIDTH) obstacle_y = -config.PLAYER_HEIGHT new_obstacle = chosen_class(obstacle_x, obstacle_y) new_obstacle.set_current_lane(random_lane) obstacles.append(new_obstacle) def spawn_coin(self, obstacles, coins, fuels): """Создает монету в свободной полосе""" random_lane = self.get_random_free_lane(obstacles, coins, fuels) if random_lane is None: return coin_x = self.get_spawn_x(random_lane, config.COIN_WIDTH) coin_y = -config.COIN_HEIGHT coins.append(Coin(coin_x, coin_y)) def spawn_fuel(self, obstacles, coins, fuels): """Создает канистру топлива в свободной полосе""" random_lane = self.get_random_free_lane(obstacles, coins, fuels) if random_lane is None: return fuel_x = self.get_spawn_x(random_lane, config.FUEL_WIDTH) fuel_y = -config.FUEL_HEIGHT fuels.append(FuelCanister(fuel_x, fuel_y))