Exemplo n.º 1
0
class Dino:
    def __init__(self, couleur, position, deplacement):
        self.__sprite = Images().charger_image(f'{CHEMIN_SPRITE}dino-{couleur}.png')
        self.__rect = self.__sprite.get_rect()
        self.__rect.x, self.__rect.y = position
        self.vitesse = 300
        self.deplacement = deplacement

        self.anim = Animation(18, 0, TAILLE_PERSO[0], TAILLE_PERSO[1], 6, 0.2)

        Maj().enregistrer(self)
        Affichage().enregistrer(self, 3)

    def maj(self, delta):
        self.anim.ajouter_temps(delta)
        self.__rect = self.__rect.move(self.vitesse * self.deplacement[0] * delta,
                                       self.vitesse * self.deplacement[1] * delta)

    def affichage(self, ecran):
        sous_sprite, sous_sprite_rect = self.anim.recuperer_sous_sprite(self.__sprite, self.__rect.x, self.__rect.y)
        ecran.blit(pygame.transform.flip(sous_sprite, self.deplacement[0] < 0, False), sous_sprite_rect)

    def get_pos(self):
        return self.__rect.x, self.__rect.y

    def fin(self):
        Affichage().supprimer(self)
        Maj().supprimer(self)
Exemplo n.º 2
0
    def __init__(self, couleur, position, deplacement):
        self.__sprite = Images().charger_image(f'{CHEMIN_SPRITE}dino-{couleur}.png')
        self.__rect = self.__sprite.get_rect()
        self.__rect.x, self.__rect.y = position
        self.vitesse = 300
        self.deplacement = deplacement

        self.anim = Animation(18, 0, TAILLE_PERSO[0], TAILLE_PERSO[1], 6, 0.2)

        Maj().enregistrer(self)
        Affichage().enregistrer(self, 3)
Exemplo n.º 3
0
    def __init__(self, positions, deplacement, couleur_joueur, vitesse=400, duree=3):
        self.__couleur_joueur = couleur_joueur
        self.__sprite = Images().charger_image(self.CHEMIN_SPRITE + 'Tornade.png')
        self.__rect = self.__sprite.get_rect()
        self.__rect.x, self.__rect.y = positions
        self.__deplacement = deplacement
        self.__vitesse = vitesse
        self.__animation = Animation(0, 0, Tornade.TAILLE_IMAGE[0], Tornade.TAILLE_IMAGE[1], 4, duree / 12)
        self.__temps_restant = duree

        Sons().jouer_son('Tornade', 'wav', math.ceil(duree/3) - 1, duree)  # Avec 3 la duree du sons
        Affichage().enregistrer(self, 1)
        Maj().enregistrer(self)
Exemplo n.º 4
0
    def maj(self, delta):
        self.__temps_anim += delta

        if not self.__fin_jeu.debut and self.__vainqueur.get_pos()[0] >= 700:
            self.__fin_jeu.debut = True

        if self.__fin_jeu.fin:
            self.__vainqueur.deplacement = (-1, 0)
            self.__vainqueur.vitesse = 0
            self.__vainqueur.anim = Animation(0, 0, TAILLE_PERSO[0], TAILLE_PERSO[1], 4, 0.2)

            for dino in self.__perdants:
                dino.fin()

            sons = Sons()
            from gestionnaires.Jeu import Jeu
            if Jeu.konami_actif():
                sons.jouer_son('k-mort2')
            else:
                sons.jouer_son('mort')
                sons.jouer_son('mort2')
                sons.jouer_son('mort3')

            sons.jouer_son('crash', 'ogg')

            BoutonRejouer(self, 550)
            Maj().supprimer(self)
Exemplo n.º 5
0
    def __init__(self, touches, couleur, nb_coeurs):
        # Private
        Joueur.__count += 1
        self.__attente_releve = False
        self.__vies = nb_coeurs
        self.__sprite = Images().charger_image(
            f'{CHEMIN_SPRITE}dino-{couleur}.png')
        self.__hud = HudVie(self.__vies, couleur)
        self.__rect = self.__sprite.get_rect()
        self.__rect.y = HAUTEUR - TAILLE_PERSO[1]
        self.__vitesse = 300
        self.__deplacement = [0, 0]
        self.__boost = 0
        self.__velocite_saut, self.vitesse_chute = 2, 4
        self.__nb_saut_restant = 1
        self._subit_tornade = -1
        self.__accroupi = False
        self.__anim_attente = Animation(0, 0, TAILLE_PERSO[0], TAILLE_PERSO[1],
                                        4, 0.2)
        self.__anim_deplacement = Animation(4, 0, TAILLE_PERSO[0],
                                            TAILLE_PERSO[1], 6, 0.13)
        self.__anim_attaque = Animation(10, 0, TAILLE_PERSO[0],
                                        TAILLE_PERSO[1], 3, 0.2)
        self.__anim_degat = Animation(13, 0, TAILLE_PERSO[0], TAILLE_PERSO[1],
                                      4, 0.2, False, 0.5)
        self.__anim_accroupi = Animation(18, 0, TAILLE_PERSO[0],
                                         TAILLE_PERSO[1], 6, 0.2)
        self.__anim_active = self.__anim_attente

        # Protected
        self._touches = touches
        self._couleur = couleur

        evenement = Evenement()
        evenement.enregistrer(pygame.KEYDOWN, self)
        evenement.enregistrer(pygame.KEYUP, self)
        Affichage().enregistrer(self, 1)
        Maj().enregistrer(self)
Exemplo n.º 6
0
def load(filename, start=None, end=None, order=None, world=False, rotate=False):
    """
    Reads a BVH file and constructs an animation
    
    Parameters
    ----------
    filename: str
        File to be opened
        
    start : int
        Optional Starting Frame
        
    end : int
        Optional Ending Frame
    
    order : str
        Optional Specifier for joint order.
        Given as string E.G 'xyz', 'zxy'
        
    world : bool
        If set to true euler angles are applied
        together in world space rather than local
        space

    Returns
    -------
    
    (animation, joint_names, frametime)
        Tuple of loaded animation and joint names
    """
    
    f = open(filename, "r")

    i = 0
    active = -1
    end_site = False
    
    names = []
    orients = Quaternions.id(0)
    offsets = np.array([]).reshape((0,3))
    parents = np.array([], dtype=int)
    
    for line in f:
        
        if "HIERARCHY" in line: continue
        if "MOTION" in line: continue

        """ Modified line read to handle mixamo data """
#        rmatch = re.match(r"ROOT (\w+)", line)
        rmatch = re.match(r"ROOT (\w+:?\w+)", line)
        if rmatch:
            names.append(rmatch.group(1))
            offsets    = np.append(offsets,    np.array([[0,0,0]]),   axis=0)
            orients.qs = np.append(orients.qs, np.array([[1,0,0,0]]), axis=0)
            parents    = np.append(parents, active)
            active = (len(parents)-1)
            continue

        if "{" in line: continue

        if "}" in line:
            if end_site: end_site = False
            else: active = parents[active]
            continue
        
        offmatch = re.match(r"\s*OFFSET\s+([\-\d\.e]+)\s+([\-\d\.e]+)\s+([\-\d\.e]+)", line)
        if offmatch:
            if not end_site:
                offsets[active] = np.array([list(map(float, offmatch.groups()))])
            continue
           
        chanmatch = re.match(r"\s*CHANNELS\s+(\d+)", line)
        if chanmatch:
            channels = int(chanmatch.group(1))
            if order is None:
                channelis = 0 if channels == 3 else 3
                channelie = 3 if channels == 3 else 6
                parts = line.split()[2+channelis:2+channelie]
                if any([p not in channelmap for p in parts]):
                    continue
                order = "".join([channelmap[p] for p in parts])
            continue

        """ Modified line read to handle mixamo data """
#        jmatch = re.match("\s*JOINT\s+(\w+)", line)
        jmatch = re.match("\s*JOINT\s+(\w+:?\w+)", line)
        if jmatch:

            if not jmatch.group(1).replace('\n', '') in ['head_ee_ry', 'left_ee_rx', 'right_ee_rx', 'left_foot_ee', 'right_foot_ee']:
                names.append(jmatch.group(1))
                offsets    = np.append(offsets,    np.array([[0,0,0]]),   axis=0)
                orients.qs = np.append(orients.qs, np.array([[1,0,0,0]]), axis=0)
                parents    = np.append(parents, active)
                active = (len(parents)-1)
            continue
        
        if "End Site" in line:
            end_site = True
            continue
              
        fmatch = re.match("\s*Frames:\s+(\d+)", line)
        if fmatch:
            if start and end:
                fnum = (end - start)-1
            else:
                fnum = int(fmatch.group(1))
            jnum = len(parents)
            positions = offsets[np.newaxis].repeat(fnum, axis=0)
            rotations = np.zeros((fnum, len(orients), 3))
            continue
        
        fmatch = re.match("\s*Frame Time:\s+([\d\.]+)", line)
        if fmatch:
            frametime = float(fmatch.group(1))
            continue
        
        if (start and end) and (i < start or i >= end-1):
            i += 1
            continue
        
        dmatch = line.strip().split(' ')
        if dmatch:
            data_block = np.array(list(map(float, dmatch)))
            N = len(parents)
            fi = i - start if start else i
            if   channels == 3:
                positions[fi,0:1] = data_block[0:3]
                rotations[fi, : ] = data_block[3: ].reshape(N,3)
            elif channels == 6:
                data_block = data_block.reshape(N,6)
                positions[fi,:] = data_block[:,0:3]
                rotations[fi,:] = data_block[:,3:6]
            elif channels == 9:
                positions[fi,0] = data_block[0:3]
                data_block = data_block[3:].reshape(N-1,9)
                rotations[fi,1:] = data_block[:,3:6]
                positions[fi,1:] += data_block[:,0:3] * data_block[:,6:9]
            else:
                raise Exception("Too many channels! %i" % channels)

            i += 1

    f.close()
    if rotate:
        rotations[:, [0]] += np.array([0, 90, 0])
    rotations = Quaternions.from_euler(np.radians(rotations), order=order, world=world)
    return (Animation(rotations, positions, orients, offsets, parents), names, frametime)
Exemplo n.º 7
0
 def on_menu_setting_button_clicked(self):
     Animation.showBySize(self.success_block_widget, 3000)
Exemplo n.º 8
0
class Bloc:
    DESSINS = {}

    def __init__(self, nom_json, x, y, taille):
        fichier_json = open(f'res/blocs/{nom_json}.json')
        self.__donnees = json.load(fichier_json)
        self.__sprite = Images().charger_image('res/img/Tileset.png')
        self._x = x
        self._y = y
        self.__z = self.__donnees['z'] if 'z' in self.__donnees.keys() else 0
        self.__taille = taille
        self._dessin = None
        self.__animation = None

        if all(cle in self.__donnees for cle in ['animation', 'temps-animation']):
            self.__animation = Animation(self.__donnees['x'], self.__donnees['y'], self.__donnees['largeur'],
                                         self.__donnees['hauteur'], self.__donnees['animation'],
                                         self.__donnees['temps-animation'])
            direction = self.__donnees['direction']
            if direction == 'x':
                self.__direction = [1, 0]
                self.__largeur = self.__donnees['largeur'] * taille
                self.__hauteur = self.__donnees['hauteur']
            else:
                self.__direction = [0, 1]
                self.__largeur = self.__donnees['largeur']
                self.__hauteur = self.__donnees['hauteur'] * taille
            Maj().enregistrer(self)
        else:
            fin_debut = 0
            fin_milieu = 0
            taille_milieu = 0

            if self.__donnees['direction'] == 'x':
                largeur = 0
                for debut in self.__donnees['debut']:
                    largeur += debut['largeur']
                fin_debut = largeur
                for milieu in self.__donnees['milieu']:
                    taille_milieu += milieu['largeur']
                largeur += taille_milieu * self.__taille
                fin_milieu = largeur
                for fin in self.__donnees['fin']:
                    largeur += fin['largeur']

                hauteur = self.__donnees['debut'][0]['hauteur']
            elif self.__donnees['direction'] == 'y':
                largeur = self.__donnees['debut'][0]['largeur']

                hauteur = 0
                for debut in self.__donnees['debut']:
                    hauteur += debut['hauteur']
                fin_debut = largeur
                for milieu in self.__donnees['milieu']:
                    taille_milieu += milieu['hauteur']
                    hauteur += taille_milieu * self.__taille
                    fin_milieu = largeur
                for fin in self.__donnees['fin']:
                    hauteur += fin['hauteur']
            else:
                largeur = self.__donnees['debut'][0]['largeur']
                hauteur = self.__donnees['debut'][0]['hauteur']

            self.__taille = taille
            nom_cache = f'{nom_json}|{taille}'
            if nom_cache not in Bloc.DESSINS:
                self.__init_dessin(largeur, hauteur, fin_debut, fin_milieu, taille_milieu)
                Bloc.DESSINS[nom_cache] = self._dessin
            else:
                self._dessin = Bloc.DESSINS[nom_cache]
            self.__largeur = self._dessin.get_width()

        Affichage().enregistrer(self, self.__z)

    def dessiner_partie(self, direction, decalage, partie):
        for element in partie:
            sprite = self.__sprite.subsurface(
                pygame.Rect(element['x'], element['y'], element['largeur'], element['hauteur']))
            x_element = element['dx'] + direction[0] * decalage
            y_element = element['dy'] + direction[1] * decalage
            self._dessin.blit(sprite, (x_element, y_element))

    def __init_dessin(self, largeur, hauteur, fin_debut, fin_milieu, taille_milieu):
        self._dessin = pygame.Surface((largeur, hauteur)).convert_alpha()
        self._dessin.fill((0, 0, 0, 0))

        direction = [0, 0]
        if self.__donnees['direction'] == 'x':
            direction[0] = 1
        elif self.__donnees['direction'] == 'y':
            direction[1] = 1

        self.dessiner_partie(direction, 0, self.__donnees['debut'])
        for i in range(0, self.__taille):
            self.dessiner_partie(direction, fin_debut + taille_milieu * i, self.__donnees['milieu'])
        self.dessiner_partie(direction, fin_milieu, self.__donnees['fin'])

    def maj(self, delta):
        self.__animation.ajouter_temps(delta)

    def affichage(self, ecran):
        if self.__animation:
            for i in range(self.__taille):
                x = self._x + (self.__donnees['largeur'] * i) * self.__direction[0]
                y = self._y + (self.__donnees['hauteur'] * i) * self.__direction[1]
                sous_sprite, sous_sprite_rect = self.__animation.recuperer_sous_sprite(self.__sprite, x, y)
                ecran.blit(sous_sprite, sous_sprite_rect)
        else:
            ecran.blit(self._dessin, (self._x, self._y))

    def set_x(self, x):
        self._x = x

    def set_y(self, y):
        self._y = y

    def get_largeur(self):
        return self.__largeur

    def get_rect(self):
        if self._dessin:
            return self._dessin.get_rect()
        else:
            return pygame.rect.Rect(self._x, self._y, self.__largeur, self.__hauteur)

    def collisions(self, joueur, delta):
        return None
Exemplo n.º 9
0
    def __init__(self, nom_json, x, y, taille):
        fichier_json = open(f'res/blocs/{nom_json}.json')
        self.__donnees = json.load(fichier_json)
        self.__sprite = Images().charger_image('res/img/Tileset.png')
        self._x = x
        self._y = y
        self.__z = self.__donnees['z'] if 'z' in self.__donnees.keys() else 0
        self.__taille = taille
        self._dessin = None
        self.__animation = None

        if all(cle in self.__donnees for cle in ['animation', 'temps-animation']):
            self.__animation = Animation(self.__donnees['x'], self.__donnees['y'], self.__donnees['largeur'],
                                         self.__donnees['hauteur'], self.__donnees['animation'],
                                         self.__donnees['temps-animation'])
            direction = self.__donnees['direction']
            if direction == 'x':
                self.__direction = [1, 0]
                self.__largeur = self.__donnees['largeur'] * taille
                self.__hauteur = self.__donnees['hauteur']
            else:
                self.__direction = [0, 1]
                self.__largeur = self.__donnees['largeur']
                self.__hauteur = self.__donnees['hauteur'] * taille
            Maj().enregistrer(self)
        else:
            fin_debut = 0
            fin_milieu = 0
            taille_milieu = 0

            if self.__donnees['direction'] == 'x':
                largeur = 0
                for debut in self.__donnees['debut']:
                    largeur += debut['largeur']
                fin_debut = largeur
                for milieu in self.__donnees['milieu']:
                    taille_milieu += milieu['largeur']
                largeur += taille_milieu * self.__taille
                fin_milieu = largeur
                for fin in self.__donnees['fin']:
                    largeur += fin['largeur']

                hauteur = self.__donnees['debut'][0]['hauteur']
            elif self.__donnees['direction'] == 'y':
                largeur = self.__donnees['debut'][0]['largeur']

                hauteur = 0
                for debut in self.__donnees['debut']:
                    hauteur += debut['hauteur']
                fin_debut = largeur
                for milieu in self.__donnees['milieu']:
                    taille_milieu += milieu['hauteur']
                    hauteur += taille_milieu * self.__taille
                    fin_milieu = largeur
                for fin in self.__donnees['fin']:
                    hauteur += fin['hauteur']
            else:
                largeur = self.__donnees['debut'][0]['largeur']
                hauteur = self.__donnees['debut'][0]['hauteur']

            self.__taille = taille
            nom_cache = f'{nom_json}|{taille}'
            if nom_cache not in Bloc.DESSINS:
                self.__init_dessin(largeur, hauteur, fin_debut, fin_milieu, taille_milieu)
                Bloc.DESSINS[nom_cache] = self._dessin
            else:
                self._dessin = Bloc.DESSINS[nom_cache]
            self.__largeur = self._dessin.get_width()

        Affichage().enregistrer(self, self.__z)
Exemplo n.º 10
0
class Tornade:
    TAILLE_IMAGE = [64, 64]
    CHEMIN_SPRITE = 'res/img/competences/'
    RECTANGLE_COLLISION = pygame.Rect(9, 0, 45, 60)

    def __init__(self, positions, deplacement, couleur_joueur, vitesse=400, duree=3):
        self.__couleur_joueur = couleur_joueur
        self.__sprite = Images().charger_image(self.CHEMIN_SPRITE + 'Tornade.png')
        self.__rect = self.__sprite.get_rect()
        self.__rect.x, self.__rect.y = positions
        self.__deplacement = deplacement
        self.__vitesse = vitesse
        self.__animation = Animation(0, 0, Tornade.TAILLE_IMAGE[0], Tornade.TAILLE_IMAGE[1], 4, duree / 12)
        self.__temps_restant = duree

        Sons().jouer_son('Tornade', 'wav', math.ceil(duree/3) - 1, duree)  # Avec 3 la duree du sons
        Affichage().enregistrer(self, 1)
        Maj().enregistrer(self)

    def maj(self, delta):
        self.gerer_collisions()
        if self.__temps_restant > 0:
            self.__animation.ajouter_temps(delta)
            self.__rect = self.__rect.move(self.__vitesse * self.__deplacement[0] * delta,
                                           self.__vitesse * self.__deplacement[1] * delta)
            self.__temps_restant -= delta
        else:
            Maj().supprimer(self)

    def affichage(self, ecran):
        if self.__temps_restant > 0:
            sous_sprite = self.__sprite.subsurface(self.__animation.recuperer_image())
            sous_sprite_rect = sous_sprite.get_rect()
            sous_sprite_rect.x, sous_sprite_rect.y = self.__rect.x, self.__rect.y
            ecran.blit(pygame.transform.flip(sous_sprite, self.__deplacement[0] < 0, False), sous_sprite_rect)
        else:
            Affichage().supprimer(self)

    def set_deplacement(self, deplacement):
        self.__deplacement = deplacement

    def get_rect(self):
        return self.__rect

    def get_couleur_joueur(self):
        return self.__couleur_joueur

    def get_rect_collision(self):
        rect = self.__rect.copy()
        rect.x += self.RECTANGLE_COLLISION.x
        rect.y += self.RECTANGLE_COLLISION.y
        rect.width = self.RECTANGLE_COLLISION.width
        rect.height = self.RECTANGLE_COLLISION.height
        return rect

    def gerer_collisions(self):
        joueurs = Jeu.Jeu().get_joueurs()
        if joueurs:
            for joueur in joueurs:
                if joueur.get_rect_collision().colliderect(self.get_rect_collision()) and self.get_couleur_joueur() != joueur.get_couleur():
                    joueur.subit_tornade()