/
World.py
114 lines (99 loc) · 3.58 KB
/
World.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
import pygame
from Simon import Simon
from Bat import Bat
from Ghoul import Ghoul
class World(object):
"""Class that represents the state of the game world"""
FPS = 60
def __init__(self, playerx, playery):
self.simon = Simon(playerx, playery)
self.obstacles = self.generate_mask_boxes("assets/levels/backgroundmask.png")
self.background = pygame.image.load("assets/levels/background.png").convert_alpha()
self.death = self.generate_mask_boxes("assets/levels/backgrounddeath.png")
self.death = self.death[0]
self.goal = pygame.Rect(6960, 190, 75, 75)
self.enemies = []
self.all_sprites = []
self.all_sprites.append(self.simon)
self.gravity = 3
self.frame = 0
self.time_limit = 240
self.time = self.time_limit
self.winner = 0
self.mp_max = 60
self.mp = self.mp_max
self.mp_regen = 5
self.stair_width = 100
self.stair_height = 40
self.bot_stairs = [
(320, 808),
(94, 582),
(752, 584),
(1275, 582),
(2660, 520),
(2799, 390),
]
self.top_stairs = [
(94, 582),
(235, 440),
(814, 520),
(1137, 454),
(2799, 390),
(2567, 164),
]
def update(self, inputs):
"""call all world processing routines"""
if self.frame < self.FPS:
self.frame += 1
else:
self.frame = 0
self.time -= 1
if self.mp < self.mp_max:
self.mp += self.mp_regen
self.simon.update(inputs, self)
if self.simon.health == 0:
self.p2win()
if self.simon.rect.colliderect(self.death):
self.p2win()
if self.time == 0:
self.p2win()
if self.simon.rect.colliderect(self.goal):
self.p1win()
for i, enemy in enumerate(self.enemies):
enemy.update(self)
if self.simon.is_attacking:
box = self.simon.attack
if box.colliderect(enemy.rect):
self.destroy_actor(i)
box = self.simon.rect
if box.colliderect(enemy):
if box.x < enemy.rect.x:
self.simon.receive_hit("Right")
else:
self.simon.receive_hit("Left")
def generate_mask_boxes(self, imagemask):
"""Returns a list of rectangle objects based on image mask"""
background_mask = (pygame.image.load(imagemask).convert_alpha())
level_mask = pygame.mask.from_surface(background_mask)
level_boxes = level_mask.get_bounding_rects()
return level_boxes
def create_enemy(self, xpos, ypos, type="Bat"):
"""create an enemy in the game world"""
unspawnable_box = self.simon.rect.inflate(300, 300)
if not unspawnable_box.collidepoint(xpos, ypos):
if type == "Ghoul" and self.mp >= Ghoul.cost:
self.mp -= Ghoul.cost
self.enemies.append(Ghoul(xpos, ypos))
self.all_sprites.append(self.enemies[-1])
elif type == "Bat" and self.mp >= Bat.cost:
self.mp -= Bat.cost
self.enemies.append(Bat(xpos, ypos))
self.all_sprites.append(self.enemies[-1])
def destroy_actor(self, index):
"""removes an enemy in the game world"""
del self.enemies[index]
del self.all_sprites[index+1]
def p1win(self):
self.winner = 1
def p2win(self):
self.winner = 2