import pygame import pymunk from .base_shape import BaseShape from .util import to_pygame class Ball(BaseShape): def __init__(self, space, x, y, radius, mass, static, cosmetic=False): if not cosmetic: moment = pymunk.moment_for_circle(mass, 0, radius) if static: self.body = pymunk.Body(mass, moment, pymunk.Body.STATIC) else: self.body = pymunk.Body(mass, moment) self.body.position = x, y self.shape = pymunk.Circle(self.body, radius) space.add(self.body, self.shape) self.static = static self._draw_radius_line = False self._x = x self._y = y self._radius = radius super().__init__(cosmetic) def _draw(self, screen): if self._cosmetic: p = (self._x, self._y) else: p = to_pygame(self.body.position) pygame.draw.circle(screen, self.color, p, int(self._radius), 0) if self.draw_radius_line: if self._cosmetic: p2 = (self._x+self._radius, self._y) else: circle_edge = self.body.position + pymunk.Vec2d(self.shape.radius, 0).rotated(self.body.angle) p2 = to_pygame(circle_edge) pygame.draw.lines(screen, pygame.Color('black'), False, [p, p2], 1) def _pin_points(self): x1 = self.body.position.x - self.shape.radius y1 = self.body.position.y x2 = self.body.position.x + self.shape.radius y2 = y1 return (x1, y1), (x2, y2) def __repr__(self): prefix = 'ball' if self.static: prefix = 'static_ball' if self._cosmetic: prefix = 'cosmetic_ball' return prefix+': p(' + str(self.body.position.x) + ',' + str(self.body.position.y) + '), radius: ' + \ str(self.shape.radius) @property def draw_radius_line(self): return self._draw_radius_line @draw_radius_line.setter def draw_radius_line(self, value): if type(value) == bool: self._draw_radius_line = value else: print("draw_radius_line value must be a True or False")