IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Pygame et le déplacement réaliste d'un personnage


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut Pygame et le déplacement réaliste d'un personnage
    Bonjour,
    je m'amuse à faire un petit programme où un bonhomme se déplace sur la scène.
    J'arrive à le faire aller à droite et gauche (les images correspondantes s'affichent) mais je ne vois pas comment lui faire alterner le pas.
    Voilà ce que j'ai fait pour l'instant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    marcheDGJG = 'marcheDGJG.png'
    marcheDGJD = 'marcheDGJD.png'
    marcheDDJG = 'marcheDDJG.png'
    marcheDDJD = 'marcheDDJD.png'
    marche=[marcheDGJG,marcheDGJD,marcheDDJG,marcheDDJD]
    background_image_filename = 'fond.jpg'
     
     
    import pygame
    from sys import exit
    from pygame.locals import *
    from gameobjects.vector2 import Vector2
     
    pygame.init()
     
    screen = pygame.display.set_mode((640, 640), 0, 32)
    pygame.display.set_caption("Combat!!")
     
     
    background=pygame.image.load(background_image_filename).convert()
     
     
    class combattant(pygame.sprite.Sprite):
     
        def __init__(self,img,posit):
            pygame.sprite.Sprite.__init__(self)
            self.image=pygame.image.load(img)
            self.image_pos=posit
     
     
     
    julien = combattant(marcheDGJG,Vector2(350,350))
     
    while True:
        screen.blit(background,(0,0))
        screen.blit(julien.image,julien.image_pos)
     
        for event in pygame.event.get():
                if event.type == QUIT:
                      exit()
        tkey=pygame.key.get_pressed()
        if tkey[K_LEFT]: 
            julien.image_pos.x -= 1
            julien.image=pygame.image.load(marche[0])
        elif tkey[K_RIGHT]: 
            julien.image_pos.x += 1
            julien.image=pygame.image.load(marche[2])
     
        pygame.display.update()
    C'est en fait un code inspiré de nombreux autres codes...il n'a rien de très original mais quand on apprend, c'est déjà ça...

    Je vous remercie de vos bonnes idées...
    @bientôt!

  2. #2
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Est-ce que tu as regardé comment j'avais fait pour le jeu oh mummy => http://guigui.developpez.com/sources...page_2#LIV-C-2

    J'avais un compteur (self.moving) qui s'incrémente (modulo 2) dès que le bonhomme fait un pas Puis l'image affiché dépend de ce compteur (ainsi que de la face visible du bonhomme (self.facing) définie par le sens de la flèche de déplacement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.moving = (self.moving + 1) % 2
    self.image = ImageOhMummy['Gargou']['Face'][2 * self.facing + self.moving]

  3. #3
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut merci de la réponse
    Merci,
    je viens de télécharger ton code, je vais essayer de voire comment ça marche.

    Bonne après-midi!

  4. #4
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut Re fonte de code
    Bonsoir,
    j'ai donc lu OhMummy et ai modifié mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #!/usr/bin/env python
     
    import pygame
    from sys import exit
    from pygame.locals import *
    from gameobjects.vector2 import Vector2
     
    pygame.init()
     
    marcheDGJG = pygame.image.load('marcheDGJG.png')
    marcheDGJD = pygame.image.load('marcheDGJD.png')
    marcheDDJG = pygame.image.load('marcheDDJG.png')
    marcheDDJD = pygame.image.load('marcheDDJD.png')
    marche=[marcheDGJG,marcheDGJD,marcheDDJG,marcheDDJD]
    background_image_filename = 'fond.jpg'
     
     
    screen = pygame.display.set_mode((640, 640), 0, 32)
    pygame.display.set_caption("Combat!!")
     
     
    background=pygame.image.load(background_image_filename).convert()
     
     
    class combattant(pygame.sprite.Sprite):
     
        def __init__(self,img,posit):
            pygame.sprite.Sprite.__init__(self)
            self.image=marche[0]
            self.image_pos=posit
            self.face=0
        def move(self,direction):
            if direction[K_LEFT]:
                self.face=(self.face+1)%2
                self.image_pos.x -= 1
                self.image=marche[0+self.face]
                print "gauche"
            if direction[K_RIGHT]:
                print "droit"
                self.face=(self.face+1)%2
                self.image_pos.x += 1
                self.image=marche[2+self.face]
     
    compte=0
     
    julien = combattant(marcheDGJG,Vector2(350,350))
     
    while True:
        screen.blit(background,(0,0))
        screen.blit(julien.image,julien.image_pos)
        temps=pygame.time.get_ticks()
     
        for event in pygame.event.get():
                if event.type == QUIT:
                      exit()
        tkey=pygame.key.get_pressed()
        julien.move(tkey)
     
        pygame.display.update()
    En effet, c'est beaucoup plus propre, de mettre une fonction move à l'intérieur de la classe combattant...

    Merci et sans doute à bientôt!

  5. #5
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut fluidité du déplacement
    Bonjour,
    savez vous combien d'images il faut mettre pour que le déplacement paraissent fluide?
    En effet, en général, on parle de 24 images par seconde...
    On va dire qu'un cycle de marche dure 2 secondes en étant très rapide. En gros, cela signifie qu'il faut 48 images pour un cycle de marche fluide!!!
    En générale, combien d'image mettez-vous et comment faites-vous pour obtenir un déplacement fluide?

    Merci et bonne soirée

  6. #6
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    C'est un avis personnel mais je pense que pour un jeu 2D, la fluidité et le nombre d'images/sec qu'on va mettre dépend surtout des sprites parce que le nombre d'images qu'un personnage possède pour un mouvement va varier d'un sprite à un autre.

    Mais si on suppose qu'il n'y a pas plusieurs images pour un mouvement (ex: un carré qui bouge), 24 images/sec est très bien.

Discussions similaires

  1. Problème de déplacement du personnage sur Pygame
    Par Youpat97 dans le forum Programmation multimédia/Jeux
    Réponses: 7
    Dernier message: 08/05/2013, 02h04
  2. Problème de déplacement du personnage sur Pygame
    Par Youpat97 dans le forum Général Python
    Réponses: 15
    Dernier message: 24/04/2013, 00h42
  3. Réponses: 1
    Dernier message: 23/01/2009, 10h44
  4. Réponses: 14
    Dernier message: 21/01/2009, 17h45
  5. Déplacement de personnage coérent
    Par poussinphp dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 25/04/2007, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo