all repos — Legends-RPG @ 43c7782a1a3a9749ebf07c8e1897407f742bc3d2

A fantasy mini-RPG built with Python and Pygame.

data/collision.py (view raw)

 1__author__ = 'justinarmstrong'
 2import pygame as pg
 3
 4class CollisionHandler(object):
 5    """Handles collisions between the user, blockers and computer
 6    characters"""
 7    def __init__(self, player, blockers, sprites):
 8        self.player = player
 9        self.static_blockers = blockers
10        self.blockers = self.make_blocker_list(blockers, sprites)
11        self.sprites = sprites
12
13
14    def make_blocker_list(self, blockers, sprites):
15        """Return a combined list of sprite blockers and object blockers"""
16        blocker_list = []
17
18        for blocker in blockers:
19            blocker_list.append(blocker)
20
21        for sprite in sprites:
22            blocker_list.extend(sprite.blockers)
23
24        return blocker_list
25
26
27    def update(self, keys, current_time):
28        """Checks for collisions between game objects"""
29        self.blockers = self.make_blocker_list(self.static_blockers,
30                                               self.sprites)
31        self.player.rect.move_ip(self.player.x_vel, self.player.y_vel)
32        self.check_for_blockers()
33
34        for sprite in self.sprites:
35            sprite.rect.move_ip(sprite.x_vel, sprite.y_vel)
36        self.check_for_blockers()
37
38        if self.player.rect.x % 32 == 0 and self.player.rect.y % 32 == 0:
39            self.player.begin_resting()
40
41        for sprite in self.sprites:
42            if sprite.state == 'automoving':
43                if sprite.rect.x % 32 == 0 and sprite.rect.y % 32 == 0:
44                    sprite.begin_auto_resting()
45
46
47    def check_for_blockers(self):
48        """Checks for collisions with blocker rects"""
49        player_collided = False
50        sprite_collided_list = []
51
52        for blocker in self.blockers:
53            if self.player.rect.colliderect(blocker):
54                player_collided = True
55
56        if player_collided:
57            self.reset_after_collision(self.player)
58            self.player.begin_resting()
59
60        for sprite in self.sprites:
61            for blocker in self.static_blockers:
62                if sprite.rect.colliderect(blocker):
63                    sprite_collided_list.append(sprite)
64            if sprite.rect.colliderect(self.player.rect):
65                sprite_collided_list.append(sprite)
66            sprite.kill()
67            if pg.sprite.spritecollideany(sprite, self.sprites):
68                sprite_collided_list.append(sprite)
69            self.sprites.add(sprite)
70
71
72        for sprite in sprite_collided_list:
73            self.reset_after_collision(sprite)
74            sprite.begin_auto_resting()
75
76
77
78    def reset_after_collision(self, sprite):
79        """Put player back to original position"""
80        if sprite.x_vel != 0:
81                sprite.rect.x -= sprite.x_vel
82        else:
83            sprite.rect.y -= sprite.y_vel
84
85
86