Mon sprite bug (pygames)

ShadowStrike - 6 mars 2024 à 21:41
 globule_vert - 7 mars 2024 à 11:10

Bonjour,

Je suis débutant dans le python et j'aimerai commencer a developer mon premier jeu vidéo ( un jeu de voitures) et le problème c'est que mon sprite au lancement du code traverse la fenêtre et disparait j'ai tout essaié rien n'y fait (J'ai même du demander de l'aide a CHATGPT) Voici mon code : Cordialement :

import pygame
import sys
import math

# Initialisation de Pygame
pygame.init()

# Définition des dimensions de l'écran
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Asphalt X")

# Couleur d'arrière-plan
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

# Charger la capture d'écran comme un sprite
car_sprite = pygame.image.load('voiture.png')

# Position initiale de la voiture
car_x = SCREEN_WIDTH // 2 - 50
car_y = SCREEN_HEIGHT // 2 - 25

# Vitesse de déplacement de la voiture
car_speed = 0

# Coefficient de sensibilité pour le joystick de direction (plus c'est élevé, plus la sensibilité est forte)
SENSITIVITY = 2.0

# Angle initial de la voiture
car_angle = 0

# Déterminer le point le plus haut de la voiture
car_width, car_height = car_sprite.get_size()
car_front_offset_x = car_width / 2
car_front_offset_y = -car_height / 2

# Décalage latéral pour le point avant
front_offset_x = -5  # Ajustez cette valeur selon vos besoins

# Fonction pour démarrer le mouvement de la voiture
def start_car_movement():
    global car_speed
    car_speed = 5

# Boucle principale
running = True
while running:
    screen.fill(BLACK)  # Effacer l'écran

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Gestion des axes du joystick
    joystick_count = pygame.joystick.get_count()
    if joystick_count < 1:
        print("Erreur: Au moins une manette est nécessaire.")
        pygame.quit()
        sys.exit()
    joystick = pygame.joystick.Joystick(0)
    joystick.init()

    # Contrôle de la direction avec le joystick du bas (axes horizontal et vertical)
    direction_x = joystick.get_axis(3) * SENSITIVITY  # Axe horizontal
    direction_y = joystick.get_axis(4) * SENSITIVITY  # Axe vertical

    # Si le joystick est légèrement déplacé, la voiture commence à se déplacer
    if abs(direction_x) > 0.1 or abs(direction_y) > 0.1:
        start_car_movement()

    # Calcul de l'angle de rotation
    car_angle += direction_x * 5

    # Calcul des composantes du vecteur de déplacement en fonction de l'angle de la voiture
    move_dx = car_speed * math.cos(math.radians(car_angle))
    move_dy = car_speed * math.sin(math.radians(car_angle))

    # Déplacement de la voiture en fonction du point avant
    car_x += move_dx
    car_y += move_dy

    # Déterminer le nouveau point le plus haut de la voiture après rotation
    rotated_offset_x = car_front_offset_x * math.cos(math.radians(car_angle)) - car_front_offset_y * math.sin(math.radians(car_angle))
    rotated_offset_y = car_front_offset_x * math.sin(math.radians(car_angle)) + car_front_offset_y * math.cos(math.radians(car_angle))
    car_front_x = car_x + rotated_offset_x
    car_front_y = car_y + rotated_offset_y

    # Appliquer le décalage latéral au point avant
    car_front_x += front_offset_x

    # Affichage de la voiture
    rotated_car = pygame.transform.rotate(car_sprite, car_angle)
    car_rect = rotated_car.get_rect(center=(car_x, car_y))
    screen.blit(rotated_car, car_rect.topleft)

    # Ajout d'une marque à l'avant de la voiture (en blanc)
    pygame.draw.circle(screen, WHITE, (int(car_front_x), int(car_front_y)), 5)

    # Rafraîchissement de l'écran
    pygame.display.flip()

    # Limiter la vitesse de la boucle
    pygame.time.Clock().tick(60)

pygame.quit()
sys.exit()


Windows / Firefox 123.0

2 réponses

yg_be Messages postés 22804 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 mai 2024 1 469
7 mars 2024 à 08:02

bonjour,

Si le joystick est légèrement déplacé, la voiture commence à se déplacer.

As-tu affiché les valeurs de direction_x et de direction_y?

0

Salut, je n'avais jamais testé une manette avec pygame, mais ce n'est pas plus compliqué qu'avec des touches directionnelles. Je ne comprends pas tous ces calculs.

Je suis nul en maths et en trigo, mais pygame fournit aussi quelques fonctions mathématiques pour les nullos comme moi ^^

Exemple avec une simple surface (à remplacer par ton image) représentant une voiture.

import math
import pygame

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 60
SCREEN_BG_COLOR = pygame.Color('black')

class Car(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self._image_base = pygame.Surface(
            (50, 25),
            pygame.SRCALPHA
        ).convert_alpha()
        self._image_base.fill((0, 255, 0))
        pygame.draw.rect(
            self._image_base, (255, 255, 0),
            (40, 0, 10, 25)
        )
        self.image = self._image_base.copy()
        self.rect = self.image.get_rect()
        self._angle = 0
        self.speed = 5

    def move(self, dx=0, dy=0):
        if not dx and not dy:
            return
        v1 = pygame.math.Vector2(0., 0.)
        v2 = pygame.math.Vector2(dx, dy)
        self._rotate(round(v2.angle_to(v1)))
        self.rect.move_ip(dx * self.speed, dy * self.speed)

    def _rotate(self, degrees):
        if self._angle == degrees:
            return
        self._angle = degrees
        self.image = pygame.transform.rotate(
            self._image_base, degrees
        )
        # Recalcul du rect de l'image
        x, y = self.rect.topleft
        self.rect = self.image.get_rect()
        self.rect.topleft = x, y


class Game:
    def __init__(self, width, height):
        pygame.init()
        self.screen = pygame.display.set_mode((width, height))
        pygame.display.set_caption('Asphalt X')
        self.joystick = pygame.joystick.Joystick(0)
        self.joystick.init()
        self.group_display = pygame.sprite.Group()
        self.car = Car()
        self.car.rect.center = (
            width // 2 - self.car.rect.w,
            height // 2 - self.car.rect.h
        )
        self.group_display.add(self.car)

    def run(self):
        clock = pygame.time.Clock()
        running = True
        while running:
            clock.tick(FPS)
            for evt in pygame.event.get():
                if evt.type == pygame.QUIT:
                    running = False
            dx = self.joystick.get_axis(2)
            dy = self.joystick.get_axis(3)
            self.car.move(dx, dy)

            self.screen.fill(SCREEN_BG_COLOR)
            self.group_display.draw(self.screen)
            pygame.display.flip()

        pygame.quit()


game = Game(800, 600)
game.run()

Ce qu'il faut regarder est la méthode move et la méthode _rotate de la classe Car.

Le code est relativement simple, zieuter un peu le module math de pygame.

On pourrait définir v1 dans l'__init__ plutôt que le recalculer chaque fois.

Évite aussi ce truc chat machin =)

0