def _setup_sprites(self): """ Initializes all sprites """ from sprite import Pad, Ball self.pad_left = Pad(relative_to=self.playarea_rect) self.pad_right = Pad(relative_to=self.playarea_rect, align=1) self.ball = Ball(relative_to=self.playarea_rect) self.allsprites = pygame.sprite.RenderUpdates(( self.pad_left, self.pad_right, self.ball )) self.pads = pygame.sprite.Group((self.pad_left, self.pad_right))
class GameView(View): def __init__(self, size=(800,600)): self.surfaces = [] self.paused = False self.stopped = False self._setup_screen(size) self._setup_background() self._setup_sprites() self._setup_score() def reset(self): """ Resets score and sprites """ self.allsprites.empty() self._setup_background() self._setup_sprites() self._setup_score() self.stopped = False def _setup_score(self): """ Sets up the score object """ from score import Score self.score = Score(self.background) def _setup_sprites(self): """ Initializes all sprites """ from sprite import Pad, Ball self.pad_left = Pad(relative_to=self.playarea_rect) self.pad_right = Pad(relative_to=self.playarea_rect, align=1) self.ball = Ball(relative_to=self.playarea_rect) self.allsprites = pygame.sprite.RenderUpdates(( self.pad_left, self.pad_right, self.ball )) self.pads = pygame.sprite.Group((self.pad_left, self.pad_right)) def _setup_background(self): self.background = pygame.Surface((self.screen.get_size())) self.background = self.background.convert() self.background.fill((0,0,0)) self.playarea = pygame.image.load(os.path.join("data", "playfield.png")) self.playarea.convert_alpha() self.playarea_rect = self.playarea.get_rect() self.playarea_rect.top = 50 self.background.blit(self.playarea, self.playarea_rect) def kill(self): self.allsprites.empty() self.stopped = True def game_over(self, win=True): """ What do you think it does?? """ self.ball.kill() if win: image = pygame.image.load(os.path.join("data", "fuckyea.jpg")) else: image = pygame.image.load(os.path.join("data", "fuuu.jpg")) image = image.convert() image_rect = image.get_rect() image_rect.center = [400, 300] self.background.blit(image, image_rect) pygame.display.flip() self.stopped = True #self.event_manager.unregister_listener(self) def handle_collisions(self): """ Detect ball - sprite collisions and handle them """ collisions = pygame.sprite.spritecollide(self.ball, self.pads, False) if len(collisions): # in the future there will be generic collision test # so the ball will bounce of extra walls etc self.ball.movement_vector[0] = -self.ball.movement_vector[0] self.ball.image = pygame.transform.flip(self.ball.image, 1, 0) ball_mid = self.ball.rect.midright[1] pad = collisions[0] pad_mid = pad.rect.midright[1] angle_speed = (pad_mid - ball_mid)/10 self.ball.movement_vector[1] -= angle_speed def notify(self, event): """ Recieve events """ if isinstance(event, events.TickEvent) and not self.stopped: if not self.paused: self.handle_collisions() self.allsprites.update() if self.surfaces: self._blit_registered_surfaces() self.screen.blit(self.background, (0,0)) self.allsprites.draw(self.screen) pygame.display.flip() elif isinstance(event, events.RegisterSurfaceEvent): self.register_surface(event.surface) elif isinstance(event, events.PauseEvent): self.paused = not self.paused elif isinstance(event, events.BlitRequestEvent): surface = getattr(self, event.surface_name) surface.blit(event.element, event.element_rect) elif isinstance(event, events.ModifyScoreEvent): self.score.modify_score(event) elif isinstance(event, events.GameOverEvent): self.game_over(event.win) elif isinstance(event, events.ControlPadEvent): if event.left: self.pad_left.pos = event.pos else: self.pad_right.pos = event.pos