def execute(self, window, player_num, rotation): self.window = window self.player_num = player_num self.rotation = rotation self.x, self.y = self.parent.x, self.parent.y self.z = -2 self.colour = self.parent.colour self.blend = True self.image = self.window.media.gfx['shot'] while True: self.move_forward(18.0) self.grid_pos = self.window.screen_to_grid_pos(self.x, self.y) t = self.window.grid.get_tile(*self.grid_pos) if t is None: self.alpha -= .2 if self.alpha < 0.0: self.destroy() else: p = self.collide_with_player() if not p is None: angle_between = Game.angle_between_points((self.x, self.y), (p.x, p.y)) p.bump(Vector2d(dir = math.radians(float(angle_between)), mag = 10.0)) self.window.do_cam_shake(10) p.hit_by_shot() self.window.particle_emitters['shot_' + str(p.player_num)].add_point((self.x, self.y), death_timer = 5) while self.scale > 0: self.scale -= .2 yield self.destroy() self.move_forward(10.0) yield
def handle_player_collision(self): p = self.collide_with_player(box_size = 64) if not p is None: angle_between = Game.angle_between_points((self.x, self.y), (p.x, p.y)) self.window.do_cam_shake(5) p.bump(Vector2d(dir = math.radians(float(angle_between)), mag = 15.0)) self.bump(Vector2d(dir = math.radians(float(angle_between)), mag = -15.0)) random.choice(self.window.media.sfx['hurt']).sound.play() self.window.media.sfx['bounce'].sound.play()
def test_returns_correct_value_when_second_directly_above_first(self): self.assertEquals(270, Game.angle_between_points((1, 2), (1, -2)))
def test_returns_correct_value_when_second_directly_to_the_left_of_first(self): self.assertEquals(180, Game.angle_between_points((1, 2), (-2, 2)))
def test_returns_zero_for_identical_points(self): self.assertEquals(0, Game.angle_between_points((1, 2), (1, 2)))
def test_returns_correct_value_for_quadrant_4(self): self.assertAlmostEquals(278.13, Game.angle_between_points((1, 2), (2, -5)), 3)
def test_returns_correct_value_for_quadrant_2(self): self.assertAlmostEquals(135.000, Game.angle_between_points((1, 2), (-2, 5)), 3)
def test_returns_correct_value_for_quadrant_1(self): self.assertAlmostEquals(71.565, Game.angle_between_points((1, 2), (2, 5)), 3)
def test_returns_correct_value_when_second_directly_below_first(self): self.assertEqual(90, Game.angle_between_points((1, 2), (1, 4)))
def test_returns_correct_value_for_quadrant_3(self): self.assertAlmostEqual(246.801, Game.angle_between_points((1, 2), (-2, -5)), 3)