Problème dans la programmation des coups d'épée

Fermé
Spacewiki - 25 oct. 2020 à 19:15
 Spacewiki - 25 oct. 2020 à 19:53
Bonjour,
je n'arrive pas à programmer mon personnage de telle sorte à ce qu'il donne un seul coup d'épée quand on appuie sur une touche donnée. Quelqu'un aurait une idée ? Voici tout le code qui pourra vous servir :

Fichier du testEngine :
import pygame
from game import *
from tkinter import *
#Le module pickle servira à la gestion des fichiers de sauvegarde.
import pickle
#On charge le fond en damier et on le redimensionne pour l'adapter à la taille de la fenêtre.
bg=pygame.image.load('resource/img/testResource/8x8bwcheck.jpg')
windowIcon=pygame.image.load('resource/img/common/windowIcon.png')
background=pygame.transform.scale(bg, (900, 900))
pygame.init()
running=True
#Les trois lignes ci-dessous permettent de définir les propriétés de la fenêtre.
pygame.display.set_caption("TestEngine")
pygame.display.set_icon(windowIcon)
screen=pygame.display.set_mode([900, 900])
pygame.display.init()
clock=pygame.time.Clock()
#Cette boucle fait tourner le jeu.
game=Game()
while running:
    clock.tick(30)
    screen.blit(background, (0, 0))
    screen.blit(game.shade.image, game.shade.rect)
    screen.blit(game.link.image, game.link.rect)
    screen.blit(game.sword.image, game.sword.rect)
    if game.pressed.get(pygame.K_RIGHT):
        game.link.move_right()
        game.shade.move_right()
    elif game.pressed.get(pygame.K_LEFT):
        game.link.move_left()
        game.shade.move_left()
    elif game.pressed.get(pygame.K_DOWN):
        game.link.move_down()
        game.shade.move_down()
    elif game.pressed.get(pygame.K_UP):
        game.link.move_up()
        game.shade.move_up()
    else:
        game.link.action="idle"
        game.sword.method="not_used"
    pygame.display.flip()
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            running=False
            pygame.quit()
        elif event.type == pygame.KEYDOWN:
            if event.key in game.pressed:
                game.pressed[event.key] = True
            else:
                if event.key==pygame.K_RETURN:
                    pass
                elif event.key==pygame.K_SPACE:
                    pass
                if game.link.action=="idle":
                    if event.key==pygame.K_y:
                        game.link.swordSlash()
                        game.sword.slash()
                    elif event.key==pygame.K_g:
                        pass
        elif event.type==pygame.KEYUP:
            if event.key in game.pressed:
                game.pressed[event.key] = False
    game.link.setImage()


Le fichier du joueur:

import pygame
#Le fichier playerIMG contient toutes les images qui serviront pour l'animation
#et la représentation du joueur.
from playerIMG import *
#La classe Shadow correspond à l'ombre de Link, que l'on peut apercevoir sous lui
#notamment lorsqu'il saute, puisque le reste du temps elle est cachée par le
#personnage en lui-même.
playerTurn="SOUTH"
playerX=415
playerY=415
class Shadow(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.velocity=14
        self.image=shadeIMG
        self.rect=self.image.get_rect()
        self.rect.x=431
        self.rect.y=445
        self.mask=pygame.mask.from_surface(self.image)
    def move_right(self):
        self.rect.x+=self.velocity
    def move_left(self):
        self.rect.x-=self.velocity
    def move_up(self):
        self.rect.y-=self.velocity
    def move_down(self):
        self.rect.y+=self.velocity
#La classe PlayerChar définit toutes les méthodes que le joueur pourra utiliser.
class PlayerChar(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.default_max_health=12
        #La variable default_max_health détermine combien de coeurs le joueur
        #aura lors de la création d'un nouveau fichier de sauvegarde.
        self.velocity=14
        #L'image idleS1 a été importée via playerIMG
        self.image=idleS1
        self.rect=self.image.get_rect()
        self.rect.x=415
        self.rect.y=415
        self.mask=pygame.mask.from_surface(self.image)
        #La variable ci-dessous détermine dans quelle direction regarde le joueur.
        #Par défaut (au début d'une partie ou à la sortie d'une maison),
        #le joueur regardera vers le bas de l'écran.
        self.direction="SOUTH"
        self.action="idle"
        #Là où image est le fichier à afficher à l'écran, frame est le numéro de
        #l'image à utiliser dans l'animation.
        self.frame=1
        playerX=self.rect.x
        playerY=self.rect.y
        playerTurn=self.direction
    def move_right(self):
        self.action="move"
        self.direction = "EAST"
        playerTurn=self.direction
        self.rect.x+=self.velocity
        playerX=self.rect.x
    def move_left(self):
        self.action="move"
        self.direction="WEST"
        self.rect.x-=self.velocity
        playerTurn=self.direction
        playerX=self.rect.x
    def move_up(self):
        self.action="move"
        self.direction="NORTH"
        playerTurn=self.direction
        self.rect.y-=self.velocity
        playerY=self.rect.y
    def move_down(self):
        self.action="move"
        self.direction="SOUTH"
        playerTurn=self.direction
        self.rect.y+=self.velocity
        playerY=self.rect.y
    def jump(self):
        pass
    def swordSlash(self):
        self.action="use_item"
    def setImage(self):
        if self.action == "idle":
            if self.direction == "SOUTH":
                self.image = idleS1
            elif self.direction == "NORTH":
                self.image = idleN1
            elif self.direction == "WEST":
                self.image = idleW
            elif self.direction == "EAST":
                self.image = idleE
            self.frame=1
        elif self.action=="move":
            if self.frame==2:
                if self.direction=="SOUTH":
                    self.image=idleS2
                elif self.direction=="NORTH":
                    self.image=idleN2
                elif self.direction=="EAST":
                    self.image=walkE
                elif self.direction=="WEST":
                    self.image=walkW
                self.frame-=1
            elif self.frame==1:
                if self.direction=="SOUTH":
                    self.image=idleS1
                elif self.direction=="NORTH":
                    self.image=idleN1
                elif self.direction=="EAST":
                    self.image=idleE
                elif self.direction=="WEST":
                    self.image=idleW
                self.frame+=1
            pygame.time.wait(75)
        elif self.action=="use_item":
            if self.frame==2:
                if self.direction=="SOUTH":
                    self.image=useItemS2
                elif self.direction=="NORTH":
                    self.image=useItemN2
                elif self.direction=="WEST":
                    self.image=useItemW2
                elif self.direction=="EAST":
                    self.image=useItemE2
                self.frame-=1
            elif self.frame==1:
                if self.direction=="SOUTH":
                    self.image=useItemS1
                elif self.direction=="NORTH":
                    self.image=useItemN1
                elif self.direction=="WEST":
                    self.image=useItemW1
                elif self.direction=="EAST":
                    self.image=useItemE1
                self.frame+=1
            pygame.time.wait(35)
        self.mask=pygame.mask.from_surface(self.image)


Le fichier de l'épée:

import pygame
from playerIMG import *
import random
from player import *
#En important ce morceau de programme, on pourra accéder à la position du joueur.
pygame.mixer.init()
error=pygame.mixer.Sound(file='resource/snd/common/Oracle_Error.wav')
slash1=pygame.mixer.Sound(file='resource/snd/common/Oracle_Sword_Slash1.wav')
slash2=pygame.mixer.Sound(file='resource/snd/common/Oracle_Sword_Slash2.wav')
slash3=pygame.mixer.Sound(file='resource/snd/common/Oracle_Sword_Slash3.wav')
swordShoot=pygame.mixer.Sound(file='resource/snd/common/Oracle_Sword_Shoot.wav')
class PlayerSword(pygame.sprite.Sprite):
    def __init__(self):
        self.default_level=1
        self.level=1
        self.damage=4
        self.image=sword3
        self.rect=self.image.get_rect()
        self.rect.x=-25
        self.rect.y=-65
        self.frame=1
        self.sound=1
        self.method="not_used"
        self.oob=False
    def chooseSound(self):
        self.sound=random.choice([1, 2, 3])
        if self.sound==1:
            slash1.play()
        elif self.sound==2:
            slash2.play()
        elif self.sound==3:
            slash3.play()
        else:
            pass
    def getOutOfBounds(self):
        self.image=sword3
        self.rect.x=-25
        self.rect.y=-65
    def slash(self):
        self.method="slash"
        for x in range(1, 3):
            self.setImage()
    def setImage(self):
        if self.method=="not_used":
            self.image=sword3
        elif self.method=="slash":
            if self.frame==3:
                if playerTurn=="SOUTH":
                    self.image=sword2
                    self.rect.x=playerX+32
                    self.rect.y=playerY+64
                    self.chooseSound()
                elif playerTurn=="NORTH":
                    self.image=sword1
                    self.rect.x=playerX+4
                    self.rect.y=playerY-60
                    self.chooseSound()
                elif playerTurn=="WEST":
                    self.image=sword3
                    self.rect.x=playerX-60
                    self.rect.y=playerY+35
                    self.chooseSound()
                elif playerTurn=="EAST":
                    self.image=sword4
                    self.rect.x=playerX+64
                    self.rect.y=playerY+36
                    self.chooseSound()
                self.frame=1
                self.oob=True
            elif self.frame==2:
                if playerTurn=="SOUTH":
                    self.image=swordSlash3
                    self.rect.x=playerX-50
                    self.rect.y=playerY+55
                elif playerTurn=="NORTH":
                    self.image=swordSlash2
                    self.rect.x=playerX+53
                    self.rect.y=playerY-52
                elif playerTurn=="WEST":
                    self.image=swordSlash1
                    self.rect.x=playerX-52
                    self.rect.y=playerY-52
                elif playerTurn=="EAST":
                    self.image=swordSlash2
                    self.rect.x=playerX+52
                    self.rect.y=playerY-52
                self.frame=3
            elif self.frame==1:
                if playerTurn=="SOUTH":
                    self.image=sword3
                    self.rect.x=playerX-50
                    self.rect.y=playerY+32
                elif playerTurn=="NORTH":
                    self.image=sword4
                    self.rect.x=playerX+63
                    self.rect.y=playerY+16
                elif playerTurn=="WEST":
                    self.image=sword1
                    self.rect.x=playerX+20
                    self.rect.y=playerY-60
                elif playerTurn=="EAST":
                    self.image=sword1
                    self.rect.x=playerX+20
                    self.rect.y=playerY-60
                self.frame=2
        pygame.time.wait(50)
        if self.oob==True:
            self.getOutOfBounds()
            self.oob=False
        


Le fichier du jeu :

import pygame
from player import *
from gear import *
class Game:
    def __init__(self):
        self.lines=[]
        #Apparition du joueur
        self.link=PlayerChar()
        self.shade=Shadow()
        self.sword=PlayerSword()
        #Ce dictionnaire permet de définir toutes les touches utilisables en jeu.
        #Par exemple, K_RIGHT correspond à la flèche de droite.
        self.pressed={
            "K_RIGHT":False,
            "K_LEFT":False,
            "K_UP":False,
            "K_DOWN":False
            }
    def initMap(self, screenCoords, world):
        pass
    def initSideScrollPart(self, dungeon, warp):
        pass





Configuration: Windows / Firefox 81.0
A voir également:

2 réponses

yg_be Messages postés 22697 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
25 oct. 2020 à 19:34
bonjour, que se passe-t-il? il donne plusieurs coups d'épées?
0
Non, le personnage effectue l'animation mais l'épée en elle-même ne se comporte pas comme prévu (disparition en cours d'animation...)
0