You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.0 KiB

import pygame.draw
from common.drawableItem import DrawableItem
from enums import color
from config.sys import *
import pymunk
from enums.color import BLACK
class BaseBilliard(DrawableItem):
def __init__(self, score: int, category: int, color: tuple[int, int, int], pos=(0, 0)):
self.__score = score
self.__color = color
self.__rigid_body = pymunk.Body(BALL_MASS, 1)
self.__rigid_body.position = pos
self.__shape = pymunk.Circle(self.__rigid_body, BALL_RADIUS)
self.__shape.collision_type = category
self.__shape.elasticity = 1.0
self.__rigid_body.velocity = pymunk.Vec2d.zero()
self.activity = True
@property
def score(self):
return self.__score
@property
def category(self):
return self.__shape.collision_type
@property
def color(self):
return self.__color
@property
def rigid_body(self):
return self.__rigid_body
@property
def shape(self):
return self.__shape
@property
def pos(self):
return self.__rigid_body.position
@pos.setter
def pos(self, pos: tuple[float, float]):
self.__rigid_body.position = pos
def draw(self, window):
pygame.draw.circle(window, self.__color, self._get_relative_pos(self.pos), BALL_RADIUS)
pygame.draw.circle(window, BLACK, self._get_relative_pos(self.pos), BALL_RADIUS, 1)
pass
def resistance(self):
length = self.__rigid_body.velocity.length
if length == 0:
return
if length < TABLE_FRICTION_FACTOR / FPS:
self.__rigid_body.velocity = pymunk.Vec2d.zero()
return
v = self.__rigid_body.velocity.scale_to_length(length - TABLE_FRICTION_FACTOR / FPS)
if v.length <= 1:
v = pymunk.Vec2d.zero()
self.__rigid_body.velocity = v
def is_stable(self):
return self.__rigid_body.velocity.length <= 1.0 or self.__rigid_body.velocity == pymunk.Vec2d.zero()