Je souhaite refaire le jeu jetpack joyride en python. Je le fais sur le site pyxel studio. Je ne suis pas très bon en python, mais j'ai réussi à avoir une bonne base sur mon jeu.
Toutefois, je rencontre plusieurs problèmes comme pour faire apparaître des missiles qui arrivent de droite à gauche. Sur mon code je ne trouve aucun problème mais quand je lance, il n'y a aucun missile qui apparaît.
Voici mon code :
import pyxel
import random
# Initialisation de la fenêtre
pyxel.init(128,128, title="Nuit du c0de")
pyxel.load("res.pyxres")# Position initiale du vaisseau
vaisseau_x =30
vaisseau_y =60# Variables pour la gravité et le déplacement vertical
gravite =0.55
saut_force =-4.5
vitesse_y =0# Position et taille du bloc
bloc_x =128
bloc_y = random.randint(0,120)
bloc_couleur =9# Nombre de vies du vaisseau
vies =3# État du jeu
game_over = False
# Animation
sprite_index =0
animation_frame_count =0# Variables pour la taille et orientation des blocs
bloc_largeur =8
bloc_hauteur = random.randint(32,64)
bloc_orientation = random.choice(["horizontal","vertical"])# Carburant
carburant_max =100
carburant = carburant_max
carburant_consommation =1
carburant_recharge =1# Pièces
pieces =[]# Liste pour stocker les pièces
piece_spawn_delay =30# Délai entre l'apparition des pièces# Score
score =0# Missiles
missiles =[]# Liste pour stocker les missiles
missile_spawn_delay =60# Délai entre l'apparition des missilesdefvaisseau_deplacement(y, vitesse_y): """Déplacement vertical du vaisseau avec gestion du carburant"""global carburant
vitesse_y += gravite
if pyxel.btn(pyxel.KEY_UP)and carburant >0:
vitesse_y = saut_force
carburant -= carburant_consommation
if y >=112:# Rechargement lorsque le vaisseau est au sol
carburant =min(carburant + carburant_recharge, carburant_max)
y += vitesse_y
if y >112:
y =112
vitesse_y =0if y <0:
y =0
vitesse_y =0return y, vitesse_y
defupdate_animation(): """Met à jour l'animation du vaisseau."""global sprite_index, animation_frame_count
if pyxel.btn(pyxel.KEY_UP)and carburant >0:# Si le vaisseau monte
animation_frame_count +=1if animation_frame_count %5==0:# Change d'image toutes les 5 frames
sprite_index =4+(sprite_index %3)# Nouveaux sprites pour la montée (indices 4, 5 et 6)elif vaisseau_y ==112:# Si le vaisseau est au solif pyxel.frame_count %5==0:
sprite_index =(sprite_index +1)%3# Images normales au sol (indices 0, 1, 2)else:
sprite_index =0# Image de base sinondefcollision_bloc(vaisseau_x, vaisseau_y, bloc_x, bloc_y, bloc_largeur, bloc_hauteur, bloc_orientation): """Vérifie si le vaisseau touche le bloc"""if bloc_orientation =="horizontal":return(
vaisseau_x < bloc_x + bloc_hauteur and
vaisseau_x +16> bloc_x and
vaisseau_y < bloc_y + bloc_largeur and
vaisseau_y +16> bloc_y
)else:return(
vaisseau_x < bloc_x + bloc_largeur and
vaisseau_x +16> bloc_x and
vaisseau_y < bloc_y + bloc_hauteur and
vaisseau_y +16> bloc_y
)defspawn_missile(): """Génère un missile à une position aléatoire"""
missile_x =128# Apparaît à droite de l'écran
missile_y = random.randint(0,120)# Position verticale aléatoire
missiles.append((missile_x, missile_y))defupdate(): """Mise à jour des variables (30 fois par seconde)"""global vaisseau_y, vitesse_y, bloc_x, bloc_y, vies, game_over, bloc_hauteur, bloc_largeur, bloc_orientation, score, piece_spawn_delay, missile_spawn_delay
if game_over:if pyxel.btnp(pyxel.KEY_R):reset_game()return# Déplacement vertical du vaisseau
vaisseau_y, vitesse_y =vaisseau_deplacement(vaisseau_y, vitesse_y)update_animation()# Défilement des obstacles
bloc_x -=2if bloc_x <-bloc_largeur:
bloc_x =128
bloc_y = random.randint(0,120)
bloc_hauteur = random.randint(32,64)
bloc_orientation = random.choice(["horizontal","vertical"])# Gestion des collisions avec les obstaclesifcollision_bloc(vaisseau_x, vaisseau_y, bloc_x, bloc_y, bloc_largeur, bloc_hauteur, bloc_orientation):
vies -=1if vies <=0:
game_over = True
else:
bloc_x =128
bloc_y = random.randint(0,120)
bloc_hauteur = random.randint(32,64)
bloc_orientation = random.choice(["horizontal","vertical"])# Générer des missiles
missile_spawn_delay -=1if missile_spawn_delay <=0:spawn_missile()
missile_spawn_delay = random.randint(30,60)# Délai aléatoire entre 1 et 2 secondes# Déplacer les missiles et vérifier les collisionsfor missile in missiles[:]:
missile_x, missile_y = missile
missile_x -=4# Déplacer le missile vers la gaucheif missile_x <-8:# Supprimer le missile s'il sort de l'écran
missiles.remove(missile)elifcollision_missile(vaisseau_x, vaisseau_y, missile_x, missile_y):
missiles.remove(missile)
vies -=1# Perdre une vie en cas de collisionif vies <=0:
game_over = True
defcollision_missile(vaisseau_x, vaisseau_y, missile_x, missile_y): """Vérifie si le vaisseau touche un missile"""return(
vaisseau_x < missile_x +8and
vaisseau_x +16> missile_x and
vaisseau_y < missile_y +8and
vaisseau_y +16> missile_y
)defreset_game(): """Réinitialise le jeu pour recommencer"""global vaisseau_y, vitesse_y, bloc_x, bloc_y, vies, game_over, bloc_hauteur, bloc_largeur, bloc_orientation, carburant, pieces, score
vaisseau_y =60
vitesse_y =0
bloc_x =128
bloc_y = random.randint(0,120)
vies =3
game_over = False
bloc_largeur =8
bloc_hauteur = random.randint(32,64)
bloc_orientation = random.choice(["horizontal","vertical"])
carburant = carburant_max
pieces =[]# Réinitialiser la liste des pièces
score =0# Réinitialiser le scoredefdraw_carburant(): """Dessine uniquement le texte indiquant le carburant en haut à gauche, sous les vies"""
pyxel.text(5,15, f"Carburant: {carburant}%", pyxel.COLOR_WHITE)defupdate(): """Mise à jour des variables (30 fois par seconde)"""global vaisseau_y, vitesse_y, bloc_x, bloc_y, vies, game_over, bloc_hauteur, bloc_largeur, bloc_orientation, score, piece_spawn_delay
if game_over:if pyxel.btnp(pyxel.KEY_R):reset_game()return# Déplacement vertical du vaisseau
vaisseau_y, vitesse_y =vaisseau_deplacement(vaisseau_y, vitesse_y)update_animation()# Défilement des obstacles
bloc_x -=2if bloc_x <-bloc_largeur:
bloc_x =128
bloc_y = random.randint(0,120)
bloc_hauteur = random.randint(32,64)
bloc_orientation = random.choice(["horizontal","vertical"])# Gestion des collisions avec les obstaclesifcollision_bloc(vaisseau_x, vaisseau_y, bloc_x, bloc_y, bloc_largeur, bloc_hauteur, bloc_orientation):
vies -=1if vies <=0:
game_over = True
else:
bloc_x =128
bloc_y = random.randint(0,120)
bloc_hauteur = random.randint(32,64)
bloc_orientation = random.choice(["horizontal","vertical"])defdraw(): """Dessine les éléments du jeu"""
pyxel.cls(0)if game_over:
pyxel.text(40,60,"GAME OVER", pyxel.COLOR_RED)
pyxel.text(20,80,"Appuyez sur R pour rejouer", pyxel.COLOR_WHITE)else:# Dessiner l'arrière-plan
pyxel.rect(0,0,128,128,3)# Dessiner le vaisseau
u = sprite_index *16
pyxel.blt(vaisseau_x, vaisseau_y,0, u,0,16,16,0)# Dessiner les obstaclesif bloc_orientation =="horizontal":
pyxel.rect(bloc_x, bloc_y, bloc_hauteur, bloc_largeur, bloc_couleur)else:
pyxel.rect(bloc_x, bloc_y, bloc_largeur, bloc_hauteur, bloc_couleur)# Dessiner les missilesfor missile_x, missile_y in missiles:
pyxel.blt(missile_x, missile_y,0,0,32,16,16,0)# Assure-toi que la texture du missile est correctement positionnée# Dessiner le HUD
pyxel.text(5,5, f"Vies: {vies}", pyxel.COLOR_WHITE)
pyxel.text(100,5, f"Score: {score}", pyxel.COLOR_WHITE)draw_carburant()
pyxel.text(5,5, f"Vies: {vies}", pyxel.COLOR_WHITE)
pyxel.text(100,5, f"Score: {score}", pyxel.COLOR_WHITE)draw_carburant()
pyxel.run(update, draw)
Je suppose que ton script est inspiré de https://nuit-du-code.forge.apps.education.fr/DOCUMENTATION/PYTHON/TUTORIELS/1-premiers-pas-avec-pyxel-premiere/
Le problème de ton code est que tu as deux fonctions update, la seconde doit, je pense, être supprimée.