/
Level.py
118 lines (101 loc) · 3.94 KB
/
Level.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
import configparser
import pygame
import os
from HelpFunctions import load_image, to_num
from Constants import PLAYER, BUILD_PROC
from Camera import Camera
from ObjectFactory import ObjFactory
from Gui.GuiManager import GuiManager
from BuildManager import BuildManager
class Background(pygame.sprite.Sprite):
def __init__(self, bg_filename):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_image(bg_filename, -1)
self.surface.blit(self.image, (0, 0))
class Level():
def __init__(self, w, h, filename, data_dir):
self.width = w
self.height = h
self._data_dir = data_dir
os.chdir(self._data_dir)
self.background = pygame.Surface((self.width, self.height))
self.background = self.background.convert()
self.background.fill((153, 217, 234))
self.objects = pygame.sprite.LayeredUpdates()
self.gravity = .5
self.camera = Camera(800, 600)
self._filename = filename
self._load_objects()
self.player = self._get_player_from_objects()
self.input_binds = []
self.gui_manager = GuiManager()
self.build_manager = BuildManager(self.spawn_object)
def get_filename(self):
return self._filename
def _get_player_from_objects(self):
for obj in self.objects:
if obj.type == PLAYER:
return obj
return None
def get_obj(self, obj_name):
for obj in self.objects:
if obj_name == obj.name:
return obj
return None
def _load_objects(self):
obj_filename = os.path.join('level_data', self._filename)
parser = configparser.ConfigParser()
if obj_filename not in parser.read(obj_filename):
print(obj_filename + 'not found/cant be read')
object_list = parser.sections()
for objname in object_list:
obj_type = parser[objname]['type']
var_dict = {'name': objname}
for option in parser[objname]:
value = parser[objname][option]
var_dict[option] = to_num(value)
self.objects.add(ObjFactory(obj_type, var_dict))
def clear(self):
while self.objects:
cur_layer = self.objects.get_top_layer()
self.objects.remove_sprites_of_layer(cur_layer)
self.background.fill((153, 217, 234))
def load(self, new_file=None):
if new_file:
self._filename = new_file
self.clear()
self._load_objects()
self.player = self._get_player_from_objects()
def update(self):
#update object positions
for obj in self.objects:
obj.update()
if obj.obey_gravity:
obj.do_gravity(self.gravity)
if obj.type == BUILD_PROC:
self.build_manager.check_build(obj)
self.check_collisions()
self.camera.update(self.player)
def draw(self, screen):
screen.blit(self.background, (0, 0))
for sprite_layer in self.objects.layers():
for sprite in self.objects.get_sprites_from_layer(sprite_layer):
if self.camera.on_screen(sprite.rect) and sprite.visible:
translated = self.camera.translate_to(sprite.rect)
sprite.draw(screen, translated)
#calls collide for each object against each object besides itself
#objects' collide function carries out what it means to collide and how to respond
def check_collisions(self):
for a_obj in self.objects:
for b_obj in self.objects:
if a_obj == b_obj:
continue
a_obj.collide(b_obj)
def objects_at(self, x, y):
col_objs = [obj for obj in self.objects if obj.rect.collidepoint(x, y)]
if col_objs:
return col_objs
else:
return None
def spawn_object(self, var_dict):
self.objects.add(ObjFactory(var_dict['type'], var_dict))