Esempio n. 1
0
class Player:
    def __init__(self, game):
        self.game = game

        self.size = (28, 60)

        self.body = PlayerBody(self)
        self.sprite = PlayerSprite(self)
        self.status = PlayerStatus(self)

        self.health = 1000
        self.damage = 0
        self.stun = 0

        self.keys = ["default"]

        #self.hurt_sound = self.game.core.get_sound("player_hurt.ogg")

    def update(self, ticks):
        self.body.update(ticks)
        self.sprite.update(ticks)
        self.status.update(ticks)

        if self.stun > 0:
            self.stun = max(self.stun - 0.1, 0)

    def collect(self, pickup):
        if pickup.drop_type == "key":
            self.keys.append(pickup.config)

    def take_damage(self, n):
        if self.sprite.flashing == 0:
            self.damage = min(self.damage + n, self.health)
            self.stun = min(self.stun + (n*10), self.health - self.damage)
            self.sprite.flashing = 60
            #self.hurt_sound.play()

    def is_dangerous(self):
        if self.body.dash_timer > 0:
            return True
        else:
            return False
class TestPlayerSprite(unittest.TestCase):

    def setUp(self):
        body = Mock()
        body.position = (10, 10)
        body.velocity = [0, 0]

        self.sprite = PlayerSprite(body)

    def test_should_has_image(self):
        self.assertTrue(hasattr(self.sprite, "image"))

    def test_should_has_body(self):
        self.assertTrue(hasattr(self.sprite, "body"))

    def test_should_has_xy_from_body(self):
        self.assertEqual(self.sprite.rect.x, self.sprite.body.position[0])
        self.assertEqual(self.sprite.rect.y, self.sprite.body.position[1])

    def test_should_update_xy_from_body(self):
        self.sprite.body.position = (20, 20)
        self.sprite.update()

        self.assertEqual(self.sprite.rect.x, self.sprite.body.position[0])
        self.assertEqual(self.sprite.rect.y, self.sprite.body.position[1])

    def test_should_play_animation_on_state(self):
        images_1 = ['image1', 'image2', 'image3']
        self.sprite.body.velocity[0] = 100
        self.sprite.images = [None, images_1]
        self.sprite.state = 1

        time.sleep(self.sprite.get_animation_speed() / 1000.0)
        self.sprite.update()
        self.assertEqual(self.sprite.image, images_1[1])
        time.sleep(self.sprite.get_animation_speed() / 1000.0)
        self.sprite.update()
        self.assertEqual(self.sprite.image, images_1[2])

    def test_should_reset_frame_on_change_state(self):
        pygame.image.load = Mock()
        self.sprite.frame = 2
        self.sprite.state = 1
        self.assertEqual(self.sprite.frame, 0)

    def test_should_reset_frame_when_end(self):
        self.sprite.images = ((1, 2, 3),)
        pygame.image.load = Mock()

        self.sprite.frame = 2
        self.sprite.change_frame()

        self.assertEqual(self.sprite.frame, 0)

    def test_shouldnt_reset_if_state_same(self):
        self.sprite.state = 1
        self.assertEqual(self.sprite.frame, 0)
        self.sprite.frame = 1
        self.sprite.state = 1
        self.assertEqual(self.sprite.frame, 1)

    def test_shouldnt_reset_time_if_state_same(self):
        self.sprite.state = 1
        ltime = self.sprite.last_frame_time
        self.sprite.state = 1
        self.assertEqual(self.sprite.last_frame_time, ltime)

    def test_should_change_frame(self):
        self.sprite.images = ((1, 2, 3),)
        self.sprite.frame = 0
        self.sprite.body.velocity[0] = 1
        self.sprite.change_frame()
        self.assertEqual(self.sprite.frame, 1)

    def test_get_current_frame(self):
        self.sprite.images = ((1, 2, 3),)
        self.sprite.frame = 1
        self.assertEqual(self.sprite.get_current_frame(), 2)

    def test_should_animation_speed_depends_on_velocityx(self):
        self.sprite.body.velocity = [10, 0]
        speed = self.sprite.get_animation_speed()
        self.sprite.body.velocity[0] = 100
        self.assertLess(self.sprite.get_animation_speed(), speed)

    def test_should_set_pos_direction(self):
        self.sprite.body.velocity[0] = 10
        self.sprite.change_direction()
        self.assertEqual(self.sprite.direction, 1)

    def test_should_set_neg_direction(self):
        self.sprite.body.velocity[0] = -10
        self.sprite.change_direction()
        self.assertEqual(self.sprite.direction, -1)

    def test_direction_not_change_after_stop(self):
        self.sprite.body.velocity[0] = -10
        self.sprite.change_direction()
        self.sprite.body.velocity[0] = 0
        self.sprite.change_direction()
        self.assertEqual(self.sprite.direction, -1)

    def test_change_direction_on_update(self):
        self.sprite.change_direction = Mock()
        self.sprite.update()
        self.assertTrue(self.sprite.change_direction.called)

    def test_flip_image_on_neg_direction(self):
        pygame.transform.flip = Mock()
        self.sprite.direction = -1
        self.sprite.update()
        self.assertTrue(pygame.transform.flip.called)