Mais je vais tout de même essayer de vous expliquer mon problème.
Lorsque je pose une bombe, l'affichage d'une explosion 3 seconde après se déroule correctement, mais l'explosion ne détruit pas les blocs autour de la bombe, mais à un autre endroit, ainsi mon personnage peut se déplacer sur les blocs qui devaient être détruits, mais pas sur ceux qui ont réellement été détruits. Je sais que ce n'est pas très explicite mais vous pouvez tester par vous même.
Pistes déjà envisagés : J'ai déjà tenté l'affichage de ma liste permettant l'affichage du niveau et il ne semble rien avoir à signaler
class Bombe:
def __init__(self, img, exp, niveau):
self.img=pygame.image.load(img).convert_alpha()
self.exp=pygame.image.load(exp).convert()
self.x=0
self.y=0
self.case_x=0
self.case_y=0
self.niveau=niveau
def explosion(self):
if self.niveau.structure[self.case_x+1][self.case_y]!="1":
fenetre.blit(self.exp,(self.x+30,self.y))
if self.niveau.structure[self.case_x+1][self.case_y]=="0":
self.niveau.structure[self.case_x+1][self.case_y]="_"
if self.niveau.structure[self.case_x-1][self.case_y]!="1":
fenetre.blit(self.exp,(self.x-30,self.y))
if self.niveau.structure[self.case_x-1][self.case_y]=="0":
self.niveau.structure[self.case_x-1][self.case_y]="_"
if self.niveau.structure[self.case_x][self.case_y+1]!="1":
fenetre.blit(self.exp,(self.x,self.y+30))
if self.niveau.structure[self.case_x][self.case_y+1]=="0":
self.niveau.structure[self.case_x][self.case_y+1]="_"
if self.niveau.structure[self.case_x][self.case_y-1]!="1":
fenetre.blit(self.exp,(self.x,self.y-30))
if self.niveau.structure[self.case_x][self.case_y-1]=="0":
self.niveau.structure[self.case_x][self.case_y-1]="_"
while continuer_jeu:
pygame.time.Clock().tick(30)
for event in pygame.event.get():
if event.type== QUIT:
continuer_jeu=0
continuer=0
pygame.quit()
elif event.type==KEYDOWN:
if event.key==K_ESCAPE:
continuer_jeu=0
elif event.key==K_RIGHT:
bb.deplacer("droite")
elif event.key==K_LEFT:
bb.deplacer("gauche")
elif event.key==K_DOWN:
bb.deplacer("bas")
elif event.key==K_UP:
bb.deplacer("haut")
elif event.key==K_RCTRL:
temps=time()-debut
if temps>=3 or temps<0:
debut=time()
bombe.x=bb.x
bombe.y=bb.y
bombe.case_x=bb.case_x
bombe.case_y=bb.case_y
elif event.key==K_d:
bb2.deplacer("droite")
elif event.key==K_a:
bb2.deplacer("gauche")
elif event.key==K_s:
bb2.deplacer("bas")
elif event.key==K_w:
bb2.deplacer("haut")
print(niveau.structure)
elif event.key==K_SPACE:
temps2=time()-debut2
if temps2>=3 or temps2<0:
print(niveau.structure)
debut2=time()
bombe2.x=bb2.x
bombe2.y=bb2.y
bombe2.case_x=bb2.case_x
bombe2.case_y=bb2.case_y
fenetre.blit(fond, (0,0))
niveau.afficher(fenetre)
temps=time()-debut
temps2=time()-debut2
if temps<3 and temps>=0:
fenetre.blit(bombe.img,(bombe.x, bombe.y))
elif temps>=3 and temps <=4:
bombe.explosion()
if temps2<3 and temps2>=0:
fenetre.blit(bombe2.img,(bombe2.x,bombe2.y))
elif temps2>=3 and temps2 <=4:
bombe2.explosion()
fenetre.blit(bb.direction, (bb.x, bb.y))
fenetre.blit(bb2.direction, (bb2.x, bb2.y))
pygame.display.flip()
Comme l'a souligné IQ, le problème c'est que tu as inversé ligne et colonnes. Mais pas au niveau de l'explosion, car on voit bien sur ton image que l'explosion est placée au bon endroit, mais au niveau de la destruction de tes murs. Regarde la partie où tu mets à jour les cases après l'explosion (notamment le code où tu changes les images).
PS: J'ai regardé en diagonal, mais tu peux remplacer tes if ... and ... en utilisant le mot-clé in, qui est plus compréhensible:
#Ancienne forme
if temps<3 and temps>=0:
if temps>=3 and temps<=4:
#Nouvelle forme
if temps in range(3):
if temps in (3,4):
En somme on ira d'abord chercher la profondeur (y) puis la largeur (x). Tu accèdera au deuxieme element de la derniere ligne par [3][2] et non pas [2][3].
En explosant tes bombes en fonction de [case_x][case_y] tu exploses l'opposé de chaque case par sa diagonale. Tes case_x et case_y sont bons ce n'est que lors de la comparasion avec le fichier de structure que tu t'es mélangé les pinceaux
OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
class Bombe:
def __init__(self, img, exp, niveau):
self.img=pygame.image.load(img).convert_alpha()
self.exp=pygame.image.load(exp).convert()
self.x=0
self.y=0
self.case_x=0
self.case_y=0
self.niveau=niveau
def explosion(self):
if self.niveau.structure[self.case_x+1][self.case_y]!="1":
fenetre.blit(self.exp,(self.x+30,self.y))
if self.niveau.structure[self.case_x+1][self.case_y]=="0":
self.niveau.structure[self.case_x+1][self.case_y]="_"
if self.niveau.structure[self.case_x-1][self.case_y]!="1":
fenetre.blit(self.exp,(self.x-30,self.y))
if self.niveau.structure[self.case_x-1][self.case_y]=="0":
self.niveau.structure[self.case_x-1][self.case_y]="_"
if self.niveau.structure[self.case_x][self.case_y+1]!="1":
fenetre.blit(self.exp,(self.x,self.y+30))
if self.niveau.structure[self.case_x][self.case_y+1]=="0":
self.niveau.structure[self.case_x][self.case_y+1]="_"
if self.niveau.structure[self.case_x][self.case_y-1]!="1":
fenetre.blit(self.exp,(self.x,self.y-30))
if self.niveau.structure[self.case_x][self.case_y-1]=="0":
self.niveau.structure[self.case_x][self.case_y-1]="_"
Ce code là est bon, seulement ton accès est en [x][y] et non [y][x]. Garde ton code en inversant simplement ton ordre d'accès.
Attention : Le code n'est pas à modifier : [self.case_x][self.case_y-1] devient [self.case_y-1][self.case_x]
OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
"J'ai déjà essayer d’inverser x/y dans tous les sens :/"
Et qu'est-ce que ça te donne? Si rien ne change, peut-être n'exécutes-tu tout simplement pas le bon code?
@IQ Dans ton exemple, tu as bien une écriture [case_x][case_y]. La première ligne correspond au "aaa" qui correspond bien à ton premier élément de liste, et la deuxième colonne (le 2è "a") est accessible avec [0][1].
Sinon personnellement je ne vois pas l'erreur dans ce morceau de code. Elle se trouve sûrement ailleurs.
En somme on ira d'abord chercher la profondeur (y) puis la largeur (x). Tu accèdera au deuxieme element de la derniere ligne par [3][2] et non pas [2][3].
En explosant tes bombes en fonction de [case_x][case_y] tu exploses l'opposé de chaque case par sa diagonale. Tes case_x et case_y sont bons ce n'est que lors de la comparasion avec le fichier de structure que tu t'es mélangé les pinceaux
@Oly : Prenons le cas du deuxième "a". Tout le monde est d'accord pour dire que ses coordonnées sont (1,0). Tout le monde est d'accord pour dire qu'on y accède dans le tableau par [0][1] Les accès aux éléments de la grille se font donc par [y][x]
En espérant éclairer ta lanterne
OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
"Tout le monde est d'accord pour dire que ses coordonnées sont (1,0)"
Je viens de comprendre qu'il fallait que j'aille voir dans son lien mediafire pour trouver l'erreur . Et donc oui je suis enfin d'accord avec toi .
Sinon Yeny3n, tu peux directement corriger ton code à la source de ton erreur. La bonne réponse est (dans ta méthode generer() je crois):
for sprite in ligne:
x=n_ligne* t_sprite
y=n_case* t_sprite
- Edité par Olygrim 22 mai 2015 à 14:33:01
Précepte: Le mieux est l'ennemi du bien
Porblème projet isn bombes bomberman [Pygame]
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.