forked from JeLLyNinjas/TerminalFighter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
universe.py
161 lines (121 loc) · 5.77 KB
/
universe.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import pygame
from basic_grunt import BasicGrunt
from maincharacter import MainCharacter
from destroy_listener import DestroyListener
class Universe(DestroyListener):
def __init__(self, bounds):
self.bounds_ = bounds
self.height_ = bounds[1]
self.width_ = bounds[0]
self.created_enemies = list()
self.created_friendly_projectiles = list()
self.created_enemy_projectiles = list()
self.created_main_character = list()
self.collisions_ = dict()
self.deleted_gameobjects_ = list()
self.enemies_ = dict()
self.enemy_projectiles_ = dict()
self.friendly_projectiles_ = dict()
self.gameobjects_ = dict()
self.main_character_ = None
"""
Access Functions
"""
def get_collisions(self, gameobject):
return self.collisions_[gameobject.id_]
def enemies(self):
return self.enemies_.values()
def enemy_projectiles(self):
return self.enemy_projectiles_.values()
def friendly_projectiles(self):
return self.friendly_projectiles_.values()
def gameobjects(self):
return self.gameobjects_.values()
def main_character(self):
return self.main_character_
"""
Update Functions
"""
def update(self, events):
for the_friendly_projectile in self.created_friendly_projectiles:
self.friendly_projectiles_[the_friendly_projectile.id_] = the_friendly_projectile
self.gameobjects_[the_friendly_projectile.id_] = the_friendly_projectile
self.created_friendly_projectiles.clear()
for the_enemy in self.created_enemies:
self.enemies_[the_enemy.id_] = the_enemy
self.gameobjects_[the_enemy.id_] = the_enemy
self.created_enemies.clear()
for the_enemy_projectile in self.created_enemy_projectiles:
self.enemy_projectiles_[the_enemy_projectile.id_] = the_enemy_projectile
self.gameobjects_[the_enemy_projectile.id_] = the_enemy_projectile
self.created_enemy_projectiles.clear()
for the_main_character in self.created_main_character:
self.main_character_ = the_main_character
self.gameobjects_[the_main_character.id_] = the_main_character
self.created_main_character.clear()
self.update_collisions()
for gameobject in self.gameobjects():
gameobject.update(events)
self.delete_out_of_bounds_gameobjects()
for gameobject_id in self.deleted_gameobjects_:
self.gameobjects_.pop(gameobject_id, None)
self.enemies_.pop(gameobject_id, None)
self.friendly_projectiles_.pop(gameobject_id, None)
self.enemy_projectiles_.pop(gameobject_id, None)
#print("Collisions : " + str(self.collisions_))
# print(str(len(self.gameobjects_)) + " gameobjects")
# print(str(len(self.enemies_)) + " enemies")
def create_enemy(self, the_enemy):
the_enemy.register(self)
self.created_enemies.append(the_enemy)
def create_enemy_projectile(self, the_enemy_projectile):
the_enemy_projectile.register(self)
self.created_enemy_projectiles.append(the_enemy_projectile)
def create_friendly_projectile(self, the_friendly_projectile):
the_friendly_projectile.register(self)
self.created_friendly_projectiles.append(the_friendly_projectile)
def create_main_character(self, the_main_character):
self.created_main_character.append(the_main_character)
def update_collisions(self):
self.collisions_ = dict()
self.update_main_character_collisions()
self.update_enemies_collisions()
self.update_friendly_projectiles_collisions()
self.update_enemy_projectiles_collisions()
def update_main_character_collisions(self):
self.collisions_[self.main_character_.id_] = []
# main character doesn't care what it collides with
def update_enemies_collisions(self):
for enemy_id in self.enemies_:
self.collisions_[enemy_id] = []
# enemies don't collideare what they collide with
def update_friendly_projectiles_collisions(self):
for friendly_projectile_id in self.friendly_projectiles_:
self.collisions_[friendly_projectile_id] = []
friendly_projectiles_collision_box = self.gameobjects_[
friendly_projectile_id].collision_box()
for enemy_id in self.enemies_:
enemy_collision_box = self.gameobjects_[
enemy_id].collision_box()
if enemy_collision_box.colliderect(friendly_projectiles_collision_box):
self.collisions_[friendly_projectile_id].append(self.gameobjects_[enemy_id])
def update_enemy_projectiles_collisions(self):
for enemy_projectile_id in self.enemy_projectiles_:
self.collisions_[enemy_projectile_id] = []
enemy_projectile_collision_box = self.gameobjects_[
enemy_projectile_id].collision_box()
main_character_collision_box = self.gameobjects_[
self.main_character_.id_].collision_box()
if main_character_collision_box.colliderect(enemy_projectile_collision_box):
self.collisions_[enemy_projectile_id].append(self.main_character_)
def delete_out_of_bounds_gameobjects(self):
out_of_bounds_IDs = []
for gameobject_id in self.gameobjects_:
if not pygame.Rect((0, 0), self.bounds_).collidepoint(self.gameobjects_[gameobject_id].position_):
out_of_bounds_IDs.append(gameobject_id)
self.deleted_gameobjects_ += out_of_bounds_IDs
"""
Listeners
"""
def reported_destroyed(self, type_gameobject):
self.deleted_gameobjects_.append(type_gameobject.id_)