Пример #1
0
class Game(object):

    def __init__(self, conffile):
        pygame.init()
        self.config = GameConfig(conffile)
        self.clock = pygame.time.Clock()

        self.layer_manager = LayerManager(self.config, self.clock)
        self.story_manager = StoryManager(self, self.layer_manager)
        self.collision_manager = CollisionManager(self.layer_manager)

        #list pour le joueur et monstre
        self.perso = None
        self.monstres = []

        self.layer_manager.set_map(self, self.config.get_start_map())
        self.layer_manager.new_layer('player', tmx.SpriteLayer)
        self.layer_manager.new_layer('npcs', tmx.SpriteLayer)
        self.layer_manager.new_layer('monster', tmx.SpriteLayer)

        self.FPS = 30
        self.clocks = {"playerHud": 0}
        self.userInput = None

    def start(self):
        #Trouve l'emplacement du héro
        source = self.layer_manager['boundaries'].find_source("start")

        self.layer_manager.set_focus(source.px, source.py, True)

        self.perso = self.charge_player()
        self.collision_manager.set_player(self.perso)
        self.perso.definir_position(source.px, source.py)

        self.monstres = self.charge_monstres()

        self.userInput = userInput.Keyboard(self)


        epe = weapon.Weapon(self.layer_manager, self.perso, 'clavier', 20, 50, 10)
        self.perso.ajoute_outils(epe, self.layer_manager)


        #hub
        self.createHuds()
        self.story_manager.read_stories(self.config.get_start_map())
        self.mainloop()

    def mainloop(self):
        while True:
            dt = self.clock.tick(self.FPS)

            quitter = EventManager.update(self)
            if quitter:
                return

            if not self.story_manager.blocking:
                self.userInput.updateKey(dt)

            for key, value in self.clocks.iteritems():
                if value >= 0:
                    if value == 0:
                        if key == "playerHud":
                            self.hideHud(key)
                            pass
                    else:
                        self.clocks[key] = value - 1

            #Récupère les collisions
            self.collision_manager.tmx_stackCollisionEvents()

            #stack les collision de monstre
            self.collision_manager.player_stackEvents()

            self.collision_manager.monster_stackEvents()

            #gère les évenement crée par le joureur
            self.collision_manager.player_manageCollisionEvents()

            #Gère les colisions selon leur nature
            self.collision_manager.tmx_manageCollisionEvents()

            self.collision_manager.monster_manageCollisionEvents()

            if self.perso.alive():
                self.layer_manager.update(self.story_manager.blocking)
            else:
                self.story_manager.display_speech(["GAME OVER"], "bottom")
                self.story_manager.set_unblockable(False)

            self.layer_manager.draw()

            pygame.display.update()
            #pygame.display.flip()

    #factory pour monstre
    def charge_monstres(self):
        monstres = []

        try:
            for cell in self.layer_manager['pnjs'].find('monstre'):
                monster_layer = []
                if "visible" not in cell.properties or cell.properties['visible']:
                    monster_layer = self.layer_manager['monster']
                m = monster.Monster(cell.name,
                                    os.path.join(self.config.get_sprite_dir(),
                                                 "sprite-Ennemi.png"),
                                    (cell.px, cell.py), monster_layer)
                m.definir_position(cell.px, cell.py)
                monstres.append(m)
        except KeyError:
            pass

        return monstres

    def charge_player(self):
        return player.Player("player",
                             os.path.join(self.config.get_sprite_dir(),
                                          "sprite-Hero.png"),
                             (0, 0), self.layer_manager['player'])

    def do_trigger(self, trigger):
        self.story_manager.read_story(trigger)

    def effectuer_transition(self, limite):
        if not isinstance(limite, tmx.Object):
            pass

        try:
            if limite.properties['barree']:
                clef_requise = limite.properties['clef']
                if not clef_requise in self.perso.tools:
                    self.story_manager.display_speech([u"La porte est barrée... Il serait certainement possible de", u"l'ouvrir si tu avais une clé."], "top")
                    return
        except KeyError:
            # la porte n'est probablement pas barrée...
            pass

        self.deleteHuds()

        source_name = self.layer_manager.get_current_filename()
        if 'destination' in limite.properties:
            self.layer_manager.set_map(self, limite.properties['destination'])
            if 'dest_transition' in limite.properties:
                source = \
                    self.layer_manager['boundaries'].find_source(limite.properties['dest_transition'])
            else:
                source = \
                    self.layer_manager['boundaries'].find_source(source_name)
            self.createHuds()
            self.perso.definir_position(source.px, source.py)
            self.charge_monstres()
            self.layer_manager.set_focus(source.px, source.py, True)
            self.story_manager.read_stories(limite.properties['destination'])

    def createHuds(self):
        hud = playerHud.PlayerHud("playerHud",
                                  self.perso,
                                  self.layer_manager)
        self.layer_manager.add_layer(hud.name, hud)

    def showHud(self, name):
        layer = self.layer_manager[name]
        layer.setVisible(True)

    def hideHud(self, name):
        layer = self.layer_manager[name]
        layer.setVisible(False)

    def deleteHuds(self):
        if "playerHud" in self.layer_manager.layers:
            layer = self.layer_manager["playerHud"]
            self.layer_manager.remove(layer)
    def addClockSec(self, name, second):
        self.clocks[name] += second * self.FPS