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