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)

2 réponses

  1. Bonjour,

    on y verrait plus clair si tu affichais ton code avec les balises de code

    cliquer ici: 


    Visuellement, ça doit ressembler à ça:

    #Test
    for k in range(10):
        print(k)
    
    0
    1. Salut,

      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.

      0