Generation d'obstacles

Bonjour,

Je suis en 2nde et je compte prendre la spé nsi. 
J'ai commencé un truc (pour moi même) et je rencontre une difficulté que j'ai un peu de mal  à formuler. En fait, j'aimerais que les obstacles (pas l'ennemi) soient générés à la même hauteur du joueur et pas n'importe ou. C'est pas très clair, mais c'est un peu dans une des versions de Jetpack Joyride, ou y a une fusée qui se lance par rapport au joueur

import pygame
import random

# Initialisation de Pygame
pygame.init()

# Définition des dimensions de la fenêtre de jeu
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# Couleurs
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
COLLO = (98, 119, 29)
BROWN = (153, 76, 0)
COLOR = (100, 100, 99)
GRAVITY = 0.25
JUMP_VELOCITY = -5.95

#fenetre
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

#liste munitions
bullets = []
#vitesse munition
bullet_speed = 5

# Classe pour la création des ennemis
class Enemy(pygame.sprite.Sprite):
    def __init__(self, obstacles):
        super().__init__()
        self.image = pygame.Surface((40, 40)) #taille de l'ennemi
        self.image.fill(BLACK) # couleur
        self.rect = self.image.get_rect()
        self.rect.x = SCREEN_WIDTH
        self.rect.y = random.randint(0, SCREEN_HEIGHT - self.rect.height)
        while self.rect.bottom > SCREEN_HEIGHT - 50:
            self.rect.y = random.randint(0, SCREEN_HEIGHT - 100)
        self.speed = 3
        self.obstacles = obstacles

    def update(self):
        self.rect.x -= self.speed

        # Vérifie s'il y a une collision avec un obstacle
        for obstacle in self.obstacles:
            if self.rect.colliderect(obstacle.rect):
                self.rect.right = obstacle.rect.left

class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((45, 45))
        self.image.fill(COLOR)
        self.rect = self.image.get_rect()
        self.rect.x = SCREEN_WIDTH
        self.rect.y = random.randint(0, SCREEN_HEIGHT - 100)
        while self.rect.bottom > SCREEN_HEIGHT - 50:
            self.rect.y = random.randint(0, SCREEN_HEIGHT - 100)
        self.speed = random.randint(4, 8)

    def update(self):
        self.rect.x -= self.speed

class Ground(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((SCREEN_WIDTH, 50))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.x = 0
        self.rect.y = SCREEN_HEIGHT - 50


# Classe pour la création du joueur
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((40, 40))
        self.image.fill(COLLO)
        self.rect = self.image.get_rect()
        self.speed = 10
        self.speed_y = 0
        # Place the player on the ground
        self.rect.x = 50
        self.rect.y = SCREEN_HEIGHT // 4 - 20
        self.velocity = 0

    def jump(self):
        self.velocity = JUMP_VELOCITY

    def update(self):
        self.velocity += GRAVITY
        self.rect.y += self.velocity

        if self.rect.bottom > SCREEN_HEIGHT:
            quit()
        if self.rect.top < 0:
            quit()


# Création des sprites pour les ennemis et le joueur
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
obstacles = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
ground = Ground()
all_sprites.add(ground)

# Boucle principale du jeu
running = True
clock = pygame.time.Clock()
score = 0
enemy_timer = 0
enemy_spawn_rate = 350
obstacle_timer = 0
obstacle_spawn_rate = 1400
score_timer = pygame.time.get_ticks()

while running:
    # Gestion des événements
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                player.jump()

        # Tirer une balle
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                # Ajouter une nouvelle balle à la liste des balles
                bullets.append([player.rect.right - 5, player.rect.centery - 5])

    # Déplacement des balles
    for bullet in bullets:
        bullet[0] += bullet_speed

    # Effacer l'écran
    screen.fill(WHITE)

    # Dessiner les balles
    for bullet in bullets:
        pygame.draw.rect(screen, BLACK, (bullet[0], bullet[1], 40, 10))

    # Gérer le déplacement du joueur
    keys = pygame.key.get_pressed()
    player.update()

    # Vérifier les collisions entre les balles et les obstacles
    for bullet in bullets:
        bullet_rect = pygame.Rect(bullet[0], bullet[1], 40, 10)
        for obstacle in obstacles:
            if bullet_rect.colliderect(obstacle.rect):
                obstacles.remove(obstacle)
                all_sprites.remove(obstacle)
                bullets.remove(bullet)
                score += 2
                break

    # Création d'un nouvel ennemi

    enemy_timer += clock.get_time()
    if enemy_timer >= enemy_spawn_rate:
        enemy = Enemy(obstacles)
        enemies.add(enemy)
        all_sprites.add(enemy)
        enemy_timer = 0

    # Création d'un nouvel obstacle
    obstacle_timer += clock.get_time()
    if obstacle_timer >= obstacle_spawn_rate:
        obstacle = Obstacle()
        obstacles.add(obstacle)
        all_sprites.add(obstacle)
        obstacle_timer = 0

    # Mise à jour des ennemis et des obstacles
    enemies.update()
    obstacles.update()

    # Vérifier les collisions entre le joueur et les ennemis
    if pygame.sprite.spritecollide(player, enemies, False):
        running = False

    if pygame.sprite.spritecollide(player, obstacles, False):
        running = False

    # Afficher les sprites
    all_sprites.draw(screen)

    current_time = pygame.time.get_ticks()
    if current_time - score_timer >= 5000:
        score_timer = current_time
        score += 5

    # Afficher le score
    font = pygame.font.Font(None, 36)
    score_text = font.render("Score: {}".format(score), True, BLACK)
    screen.blit(score_text, (10, 10))


    # Mettre à jour l'affichage
    pygame.display.update()

    clock.tick(90)

# Quitter Pygame
pygame.quit()

1 réponse

  1. Salut,

    Ce n'est pas très compliqué.

    Ajouter un paramètre y à la classe Obstacle, et enlever le choix aléatoire (bizarrement fait).

    class Obstacle(pygame.sprite.Sprite):
        def __init__(self, y):
            super().__init__()
            self.image = pygame.Surface((45, 45))
            self.image.fill(COLOR)
            self.rect = self.image.get_rect()
            self.rect.topleft = SCREEN_WIDTH, y
            # self.rect.x = SCREEN_WIDTH
            # self.rect.y = random.randint(0, SCREEN_HEIGHT - 100)
            # while self.rect.bottom > SCREEN_HEIGHT - 50:
                # self.rect.y = random.randint(0, SCREEN_HEIGHT - 100)
            self.speed = random.randint(4, 8)
    
        def update(self):
            self.rect.x -= self.speed

    Ne reste plus qu'à passer dans la création des obstacles, la position du joueur.

    # Création d'un nouvel obstacle
    obstacle_timer += clock.get_time()
    if obstacle_timer >= obstacle_spawn_rate:
        obstacle = Obstacle(player.rect.y)
        # …

    Et voilà.

    0

    Discussions similaires

    Xbox première génération

    3 réponses