Jeu jetpack joyride en python
Bonjour,
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 missiles
def vaisseau_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 = 0
if y < 0:
y = 0
vitesse_y = 0
return y, vitesse_y
def update_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 += 1
if 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 sol
if 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 sinon
def collision_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
)
def spawn_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))
def update():
"""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 -= 2
if 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 obstacles
if collision_bloc(vaisseau_x, vaisseau_y, bloc_x, bloc_y, bloc_largeur, bloc_hauteur, bloc_orientation):
vies -= 1
if 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 -= 1
if 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 collisions
for missile in missiles[:]:
missile_x, missile_y = missile
missile_x -= 4 # Déplacer le missile vers la gauche
if missile_x < -8: # Supprimer le missile s'il sort de l'écran
missiles.remove(missile)
elif collision_missile(vaisseau_x, vaisseau_y, missile_x, missile_y):
missiles.remove(missile)
vies -= 1 # Perdre une vie en cas de collision
if vies <= 0:
game_over = True
def collision_missile(vaisseau_x, vaisseau_y, missile_x, missile_y):
"""Vérifie si le vaisseau touche un missile"""
return (
vaisseau_x < missile_x + 8 and
vaisseau_x + 16 > missile_x and
vaisseau_y < missile_y + 8 and
vaisseau_y + 16 > missile_y
)
def reset_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 score
def draw_carburant():
"""Dessine uniquement le texte indiquant le carburant en haut à gauche, sous les vies"""
pyxel.text(5, 15, f"Carburant: {carburant}%", pyxel.COLOR_WHITE)
def update():
"""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 -= 2
if 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 obstacles
if collision_bloc(vaisseau_x, vaisseau_y, bloc_x, bloc_y, bloc_largeur, bloc_hauteur, bloc_orientation):
vies -= 1
if 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"])
def draw():
"""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 obstacles
if 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 missiles
for 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)