feat: add track classes

This commit is contained in:
2025-10-18 01:32:04 +02:00
parent e154a1fde9
commit da8c64624f
3 changed files with 79 additions and 0 deletions

61
src/track.py Normal file
View File

@@ -0,0 +1,61 @@
from __future__ import annotations
import json
from src.track_object import TrackObject, TrackObjectType
from src.utils import ROOT
from src.vec import Vec
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:
if obj_data["type"] == "road":
self.objects.append(Road.load(obj_data))
class RoadPoint:
def __init__(self, pos: Vec, direction: Vec, width: float) -> None:
self.pos: Vec = pos
self.direction: Vec = direction
self.width: float = width
@staticmethod
def load(data: list[float]) -> RoadPoint:
return RoadPoint(Vec(data[0], data[1]), Vec(data[2], data[3]), data[4])
class Road(TrackObject):
def __init__(self, pts: list[RoadPoint]) -> None:
super().__init__(TrackObjectType.Road)
self.pts: list[RoadPoint] = pts
@staticmethod
def load(data: dict) -> Road:
return Road([RoadPoint.load(pt) for pt in data["pts"]])

13
src/track_object.py Normal file
View File

@@ -0,0 +1,13 @@
from enum import StrEnum
class TrackObjectType(StrEnum):
Road = "road"
class TrackObject:
def __init__(
self,
type: TrackObjectType,
) -> None:
self.type: TrackObjectType = type

5
src/utils.py Normal file
View File

@@ -0,0 +1,5 @@
import os
from pathlib import Path
ROOT = Path(os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)))