55 lines
1.5 KiB
Python
55 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
import pygame
|
|
|
|
from src.camera import Camera
|
|
from src.track_object import TrackObject
|
|
from src.utils import ROOT
|
|
from src.vec import Vec
|
|
|
|
TrackObject.init()
|
|
|
|
|
|
class Track:
|
|
TRACKS_DIRECTORY = ROOT / "assets" / "tracks"
|
|
|
|
def __init__(self, id: str, name: str, start_pos: Vec, start_dir: Vec) -> None:
|
|
self.id: str = id
|
|
self.name: str = name
|
|
self.start_pos: Vec = start_pos
|
|
self.start_dir: Vec = start_dir
|
|
self.objects: list[TrackObject] = []
|
|
self.load_objects()
|
|
|
|
@staticmethod
|
|
def load(name: str) -> Track:
|
|
with open(Track.TRACKS_DIRECTORY / name / "meta.json", "r") as f:
|
|
meta: dict = json.load(f)
|
|
|
|
return Track(
|
|
name,
|
|
meta["name"],
|
|
Vec(*meta["start"]["pos"]),
|
|
Vec(*meta["start"]["direction"]),
|
|
)
|
|
|
|
def load_objects(self):
|
|
with open(Track.TRACKS_DIRECTORY / self.id / "track.json", "r") as f:
|
|
data: list = json.load(f)
|
|
|
|
self.objects = []
|
|
for obj_data in data:
|
|
self.objects.append(TrackObject.load(obj_data))
|
|
|
|
def render(self, surf: pygame.Surface, camera: Camera):
|
|
for object in self.objects:
|
|
object.render(surf, camera)
|
|
|
|
def get_collision_polygons(self) -> list[list[Vec]]:
|
|
polygons: list[list[Vec]] = []
|
|
for obj in self.objects:
|
|
polygons.extend(obj.get_collision_polygons())
|
|
return polygons
|