From a5652fbe2dae69eecebfc6e8693668370585c359 Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 13 Mar 2026 18:33:18 -0400 Subject: [PATCH] added capsule collider --- collider/types.py | 51 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/collider/types.py b/collider/types.py index f5e04dc..c0b20f3 100644 --- a/collider/types.py +++ b/collider/types.py @@ -1,6 +1,7 @@ from dataclasses import dataclass from typing import Generator from abc import ABC, abstractmethod +from math import pi, cos, sin import pygame as pg from transform import Transform @@ -89,4 +90,52 @@ class RectCollider(ConvexCollider): ]) def moment_of_inertia(self, mass: float) -> float: - return (1.0 / 12.0) * mass * (self.width ** 2 + self.height ** 2) \ No newline at end of file + return (1.0 / 12.0) * mass * (self.width ** 2 + self.height ** 2) + +@dataclass +class CapsuleCollider(ConvexCollider): + width: float + height: float + resolution: int = 8 + + @property + def radius(self) -> float: + return self.width / 2 + + @property + def _half_height(self) -> float: + return (self.height / 2) - self.radius + +@dataclass +class CapsuleCollider(ConvexCollider): + width: float + height: float + resolution: int = 10 + + @property + def radius(self) -> float: + return self.width / 2 + + def hull(self, transform: Transform) -> PolygonalHull: + verts: list[pg.Vector2] = [] + center_offset = (self.height / 2.0 - self.radius) + top_center = transform.global_position - pg.Vector2(0, center_offset).rotate(transform.global_degrees) * transform.global_scale + bottom_center = transform.global_position + pg.Vector2(0, center_offset).rotate(transform.global_degrees) * transform.global_scale + angle = pi + for _ in range(0, self.resolution): + verts.append( + top_center + (self.radius * pg.Vector2(cos(angle), -sin(angle))).rotate(transform.global_degrees) * transform.global_scale + ) + angle -= pi / self.resolution + + angle = 0.0 + for _ in range(0, self.resolution): + verts.append( + bottom_center + (self.radius * pg.Vector2(cos(angle), -sin(angle))).rotate(transform.global_degrees) * transform.global_scale + ) + angle -= pi / self.resolution + return PolygonalHull(verts) + + + def moment_of_inertia(self, mass: float) -> float: + return (1.0 / 12.0) * mass * (self.width ** 2 + self.height ** 2) \ No newline at end of file