Generation d'obstacles
Jean
-
simbioz -
simbioz -
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()
A voir également:
- Generation d'obstacles
- Generation ryzen - Guide
- Réinitialiser chromecast 1ere génération - Guide
- Generation mot de passe - Télécharger - Sécurité
- Airpods 3eme generation - Guide
- Kindle 11eme generation - Accueil - Guide tablettes
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.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à.