Код IT
← Каталог

Python — Racing — `game/track.py`

Фрагмент из «Python — Racing»: `game/track.py`.

python spinoffencyclopedia9-04-razrabotka-igr-praktikum-razrabotki-igr-4 embed URL статья в энциклопедии
Python main.py
import pygame

import config as C


def ellipse_norm(x, y, rx, ry):
    dx = x - C.TRACK_CX
    dy = y - C.TRACK_CY
    return (dx / rx) ** 2 + (dy / ry) ** 2


class Track:
    EPS = 0.02

    def is_on_track(self, x, y):
        outer = ellipse_norm(x, y, C.OUTER_RX, C.OUTER_RY)
        inner = ellipse_norm(x, y, C.INNER_RX, C.INNER_RY)
        return inner >= 1.0 - self.EPS and outer <= 1.0 + self.EPS

    def clamp_car(self, car):
        x, y = car.x, car.y
        inner = ellipse_norm(x, y, C.INNER_RX, C.INNER_RY)
        outer = ellipse_norm(x, y, C.OUTER_RX, C.OUTER_RY)
        dx = x - C.TRACK_CX
        dy = y - C.TRACK_CY
        hit = False

        if outer > 1.0:
            scale = (1.0 - self.EPS) / (outer**0.5)
            x = C.TRACK_CX + dx * scale
            y = C.TRACK_CY + dy * scale
            hit = True
        elif inner < 1.0:
            scale = (1.0 + self.EPS) / (inner**0.5)
            x = C.TRACK_CX + dx * scale
            y = C.TRACK_CY + dy * scale
            hit = True

        if hit:
            car.speed *= 0.55
        car.x, car.y = x, y

    def draw(self, surface):
        outer = pygame.Rect(
            C.TRACK_CX - C.OUTER_RX,
            C.TRACK_CY - C.OUTER_RY,
            C.OUTER_RX * 2,
            C.OUTER_RY * 2,
        )
        inner = pygame.Rect(
            C.TRACK_CX - C.INNER_RX,
            C.TRACK_CY - C.INNER_RY,
            C.INNER_RX * 2,
            C.INNER_RY * 2,
        )
        pygame.draw.ellipse(surface, C.COLOR_ASPHALT, outer)
        pygame.draw.ellipse(surface, C.COLOR_LAWN, inner)
        pygame.draw.ellipse(surface, C.COLOR_LINE, outer, 3)
        pygame.draw.ellipse(surface, C.COLOR_LINE, inner, 2)

        finish_x = C.TRACK_CX
        finish_y = C.TRACK_CY + (C.INNER_RY + C.OUTER_RY) // 2
        pygame.draw.line(
            surface,
            (255, 255, 0),
            (finish_x - 30, finish_y),
            (finish_x + 30, finish_y),
            4,
        )
import pygame

import config as C


def ellipse_norm(x, y, rx, ry):
    dx = x - C.TRACK_CX
    dy = y - C.TRACK_CY
    return (dx / rx) ** 2 + (dy / ry) ** 2


class Track:
    EPS = 0.02

    def is_on_track(self, x, y):
        outer = ellipse_norm(x, y, C.OUTER_RX, C.OUTER_RY)
        inner = ellipse_norm(x, y, C.INNER_RX, C.INNER_RY)
        return inner >= 1.0 - self.EPS and outer <= 1.0 + self.EPS

    def clamp_car(self, car):
        x, y = car.x, car.y
        inner = ellipse_norm(x, y, C.INNER_RX, C.INNER_RY)
        outer = ellipse_norm(x, y, C.OUTER_RX, C.OUTER_RY)
        dx = x - C.TRACK_CX
        dy = y - C.TRACK_CY
        hit = False

        if outer > 1.0:
            scale = (1.0 - self.EPS) / (outer**0.5)
            x = C.TRACK_CX + dx * scale
            y = C.TRACK_CY + dy * scale
            hit = True
        elif inner < 1.0:
            scale = (1.0 + self.EPS) / (inner**0.5)
            x = C.TRACK_CX + dx * scale
            y = C.TRACK_CY + dy * scale
            hit = True

        if hit:
            car.speed *= 0.55
        car.x, car.y = x, y

    def draw(self, surface):
        outer = pygame.Rect(
            C.TRACK_CX - C.OUTER_RX,
            C.TRACK_CY - C.OUTER_RY,
            C.OUTER_RX * 2,
            C.OUTER_RY * 2,
        )
        inner = pygame.Rect(
            C.TRACK_CX - C.INNER_RX,
            C.TRACK_CY - C.INNER_RY,
            C.INNER_RX * 2,
            C.INNER_RY * 2,
        )
        pygame.draw.ellipse(surface, C.COLOR_ASPHALT, outer)
        pygame.draw.ellipse(surface, C.COLOR_LAWN, inner)
        pygame.draw.ellipse(surface, C.COLOR_LINE, outer, 3)
        pygame.draw.ellipse(surface, C.COLOR_LINE, inner, 2)

        finish_x = C.TRACK_CX
        finish_y = C.TRACK_CY + (C.INNER_RY + C.OUTER_RY) // 2
        pygame.draw.line(
            surface,
            (255, 255, 0),
            (finish_x - 30, finish_y),
            (finish_x + 30, finish_y),
            4,
        )