Mon sprite bug (pygames)
globule_vert -
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
- Mon sprite bug (pygames)
- Bug chromecast - Guide
- Iptv bug forum ✓ - Forum Box et Streaming vidéo
- Bug localisation snap ✓ - Forum Snapchat
- Savoir qui regarde notre localisation ? - Forum Snapchat
- Bug snap message invisible - Forum Snapchat
2 réponses
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?
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 =)