示例#1
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))