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

GUI Python Discussion :

Pygame les arcanes des collisions


Sujet :

GUI Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    étudient
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : étudient

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Pygame les arcanes des collisions
    Bonjour à tous, je suis en train de faire un petit jeu avec pygame.
    mais voila, j'ai du mal à gerer les collisions, alors que jy suis presque.
    je suis sûr que certain d'entre vous connaissent pygame et je compte sur votre aide pour résoudre mon problème^^

    le problème :
    pygame pense que mon personnage est constamment en collision et donc, je ne peux pas le déplacer !

    voici mon code je compte sur vos réponses :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    import pygame
    from pygame.locals import *
    from constantes import *
     
    pygame.init()
     
    #Ouverture de la fenêtre Pygame
    fenetre = pygame.display.set_mode((545, 416))
     
    #Personnalisation du jeu
    icone = pygame.image.load(image_icone)
    pygame.display.set_icon(icone)
    pygame.display.set_caption(titre_fenetre)
     
    #Chargement et collage du fond
    fond = pygame.image.load(image_accueil).convert()
    fenetre.blit(fond, (0,0))
    pygame.display.flip()
     
    mur1 = pygame.Rect(1, 1, 30, 416)
    mescollisions = [mur1]
     
    #son
    son = pygame.mixer.Sound(SAN_1)
    son.play()
     
    resterac = True
     
    class hero(pygame.sprite.Sprite):
        def __init__(self):
            self.image_face = pygame.image.load("images/perso_face.png").convert_alpha()
            self.image_left = pygame.image.load("images/perso_left.png").convert_alpha()
            self.image_right = pygame.image.load("images/perso_right.png").convert_alpha()
            self.image_back = pygame.image.load("images/perso_back.png").convert_alpha
            self.image = self.image_right
            self.position = pygame.Rect(85, 168, 27, 32,)
     
    hero = hero()
     
    while resterac:                        
        for event in pygame.event.get():
     
            if event.type == QUIT:
                resterac = False
     
            if event.type == KEYDOWN:
                if event.key == K_SPACE:
                    fond = pygame.image.load(T_a).convert()
                    fenetre.blit(fond, (0,0))
                    jeu = True
                    fenetre.blit(hero.image, hero.position)
                    pygame.key.set_repeat(1, 35)
     
                    pygame.display.flip()
     
                    #Boucle jeu
     
                    while jeu:
     
                        for event in pygame.event.get():
                            if event.type == QUIT:
                                jeu = False
                            if event.type == KEYDOWN:
                                if hero.position.collidelist(mescollisions) == -1:
                                    hero.position.x -= 1 #Il ne s'arrête pas mais recule d'un pixel
                                else:
     
                                    if event.key == K_w:
                                        hero.position.y += 10
                                        hero.image = hero.image_back
     
                                    elif event.key == K_s:
                                        hero.position.y -= 10
                                        hero.image = hero.image_face
     
                                    elif event.key == K_a:
                                        hero.position.x -= 10
                                        hero.image = hero.image_left
     
                                    elif event.key == K_d:
                                        hero.position.x += 10
                                        hero = hero.image_right
     
     
                        fenetre.blit(fond, (0,0))
                        fenetre.blit(hero.image, hero.position)
                        pygame.display.flip()

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    J'ai pas testé le code, mais à vue de nez, le personnage recule en permanence, non ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    étudient
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : étudient

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Oui, mon personnage recule ne permanence

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    C'est normal, tu as codé que s'il n'y a pas de collision alors il faut reculer d'un pixel.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    étudient
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : étudient

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ok, donc je doit remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if hero.position.collidelist(mescollisions) == -1:
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if hero.position.collidelist(mescollisions) == 1:
    ?

    EDIT : je pense ne pas avoir juste car j'ai testé, et avec ça, dès que je déplace mon personnage j'ai une erreur

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Relis bien la doc de la méthode collidelist; ça retourne un indice s'il y a collision et -1 s'il n'y en a pas.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    étudient
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : étudient

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci mais je ne comprend pas bien, qu'est-ce que l'indice ?

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Dans:

    r.collidelist ([a, b, c, d, e])

    Pygame parcours chaque rectangle de la liste et teste s'il entre en collision avec r.
    Dès qu'il rencontre un élément entrant en collision avec r, il arrête de parcourir et retourne l'indice de l'élément. Par exemple si r entre en collision avec a, il retourne 0, si c'est avec c, il retourne 2, etc ...
    S'il n'y a pas de collision, pygame retourne -1.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    étudient
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : étudient

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup.
    les collisions fonctionnent,
    mais j'ai un problème :
    dès que j'essaye de me déplacer vers le haut ou vers la droite j'ai cette erreur :

    line 89, in <module>
    fenetre.blit(hero.image, hero.position)
    typeError: argument 1 must be pygame.Surface, not builtin_function_or_method

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    import pygame
    from pygame.locals import *
    from tkinter import *
    from Fonctions.IntroTkinter import *
     
    IntroTkinter()
     
    pygame.init()
     
    #Ouverture de la fenêtre Pygame
    fenetre = pygame.display.set_mode((545, 416))
     
    #Personnalisation du jeu
    icone = pygame.image.load("images/icone.png")
    pygame.display.set_icon(icone)
    pygame.display.set_caption("Veneficus Legend 1.0")
     
    #Chargement et collage du fond
    fond = pygame.image.load("images/fond-titre.png").convert()
    fenetre.blit(fond, (0,0))
    pygame.display.flip()
     
    #Préparation des collisions
    wall_left = pygame.Rect(1, 1, 30, 416)
    mescollisions = [wall_left]
     
    #son
    son = pygame.mixer.Sound("son/sonambiance.wav")
    son.play()
     
    resterac = True
     
    class hero(pygame.sprite.Sprite):
        def __init__(self):
            self.image_face = pygame.image.load("images/perso_face.png").convert_alpha()
            self.image_left = pygame.image.load("images/perso_left.png").convert_alpha()
            self.image_right = pygame.image.load("images/perso_right.png").convert_alpha()
            self.image_back = pygame.image.load("images/perso_back.png").convert_alpha
            self.image = self.image_right
            self.position = pygame.Rect(85, 168, 27, 32,)
     
    hero = hero()
     
    while resterac:                        
        for event in pygame.event.get():
     
            if event.type == QUIT:
                resterac = False
     
            if event.type == KEYDOWN:
                if event.key == K_SPACE:
                    fond = pygame.image.load("images/terrain_a.png").convert()
                    fenetre.blit(fond, (0,0))
                    jeu = True
                    fenetre.blit(hero.image, hero.position)
                    pygame.key.set_repeat(1, 35)
     
                    pygame.display.flip()
     
                    #Boucle jeu
     
                    while jeu:
     
                        for event in pygame.event.get():
                            if event.type == QUIT:
                                jeu = False
                            if event.type == KEYDOWN:
                                if hero.position.collidelist([wall_left]) == 0:
                                    hero.position.x += 1
                                if hero.position.collidelist(mescollisions) == -1:
     
                                    if event.key == K_w:
                                        hero.position.y -= 10
                                        hero.image = hero.image_back
     
                                    elif event.key == K_s:
                                        hero.position.y += 10
                                        hero.image = hero.image_face
     
                                    elif event.key == K_a:
                                        hero.position.x -= 10
                                        hero.image = hero.image_left
     
                                    elif event.key == K_d:
                                        hero.position.x += 10
                                        hero = hero.image_right
     
     
                        fenetre.blit(fond, (0,0))
                        fenetre.blit(hero.image, hero.position)
                        pygame.display.flip()

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    L'erreur se trouve ligne 86 dans ton copié/collé.

Discussions similaires

  1. Théorie des collisions : exemples de collisions dans les jeux
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 09/01/2014, 20h30
  2. Théorie des collisions : Optimisations avec les méthodes de partionnement de l'espace
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 28/12/2013, 19h58
  3. Réponses: 3
    Dernier message: 06/01/2012, 15h26
  4. Evitement des collisions en utilisant les boites englobantes
    Par eemii dans le forum Intelligence artificielle
    Réponses: 2
    Dernier message: 18/03/2010, 10h29
  5. Réponses: 2
    Dernier message: 22/07/2002, 18h02

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