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
-
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.speedNe 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à.