Ejemplo n.º 1
0
def load_level(game, filename):
    filename = os.path.join('levels', filename)
    try:
        tmx_data = pytmx.load_pygame(filename, pixelalpha=True)
    except:
        print 'Level %s could not be read as a TMX file.' % (filename)
        raise

    try:
        name = tmx_data.name
    except AttributeError:
        print 'Level %s has no name: invalid level file.' % (filename)

    width = tmx_data.width
    height = tmx_data.height

    state_images = defaultdict(dict)
    animations = defaultdict(lambda: defaultdict(Animation))

    for tile_id, properties in tmx_data.tile_properties.items():
        image = tmx_data.getTileImageByGid(tile_id)
        try:
            name = properties['name']
        except KeyError:
            continue

        state = properties.get('state', 'default')
        frame = properties.get('frame', None)
        if frame:
            delay = properties.get('frame-delay', '4')
            try:
                delay = int(delay)
            except ValueError:
                print "Level %s has invalid frame delay of %s for frame %s/%s/%s" % (filename, delay, name, state, frame)

            try:
                frame = int(frame)
            except ValueError:
                print "Level %s has invalid frame: %s/%s/%s" % (filename, name, state, frame)

            animations[name][state].add_frame(frame, image, delay)
        else:
            state_images[name][state] = image

    for state in animations.values():
        for animation in state.values():
            animation.finalise()

    level = Level(game, name, width, height)
    for layer in tmx_data.tilelayers:
        for (x, y, tile) in layer:
            if tile == 0:
                continue
            name = tmx_data.tile_properties[tile]['name']
            state = tmx_data.tile_properties[tile].get('state', 'default')
            objtype = OBJECTS[name]
            obj = objtype(level=level, location=(x, y))
            obj.state = state
            obj.state_images = state_images[name]

            obj.animations = animations[name]
            if isinstance(obj, Player):
                level.player = obj

    for obj in tmx_data.getObjects():
        x = int(obj.x / TILE_W)
        y = int(obj.y / TILE_H)
        w = int(obj.width / TILE_W)
        h = int(obj.height / TILE_H)
        region = Region(obj.name, level, (x, y), (w, h))
        if hasattr(obj, 'message'):
            region.message = obj.message.decode('string-escape')
        if hasattr(obj, 'points'):
            region.set_vertices([(px/TILE_W, py/TILE_H) for (px, py) in obj.points])
        if hasattr(obj, 'dependencies'):
            for name in obj.dependencies.split(','):
                region.add_dependency(name)
        if hasattr(obj, 'anti_dependencies'):
            for name in obj.anti_dependencies.split(','):
                region.add_anti_dependency(name)
        region.visible = hasattr(obj, 'show')
        region.state_images = {'default' : None, 'visible' : state_images['hint']['default']}

    level.load_finished()

    return level