Maison >développement back-end >Tutoriel Python >Pourquoi ma boucle de jeu Pygame ne fonctionne-t-elle pas et comment puis-je implémenter un système de caméra ?

Pourquoi ma boucle de jeu Pygame ne fonctionne-t-elle pas et comment puis-je implémenter un système de caméra ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-17 11:33:02684parcourir

Why Is My Pygame Game Loop Not Working and How Can I Implement a Camera System?

Dépannage d'une boucle d'application Pygame non fonctionnelle

En développant votre application Pygame, vous avez rencontré des difficultés avec la fonctionnalité de la boucle de jeu. Plus précisément, vous avez tenté de créer un système de caméra, mais vous avez constaté que les didacticiels obsolètes ne s'appliquent plus. Cet article fournit des informations sur le dépannage de votre application et la mise en œuvre d'un système de caméra.

Comprendre la boucle de jeu

La boucle de jeu de Pygame est cruciale pour le bon fonctionnement de votre application. Il s'exécute généralement dans une boucle constante, gérant les tâches suivantes :

  • Gestion des événements
  • Mises à jour de l'état des objets (en fonction de l'entrée et de l'heure)
  • Rendu en arrière-plan
  • Rendu de scène (affichage de tous les objets)
  • Écran update

Votre malentendu

Dans votre extrait de code d'origine, vous avez mal interprété le processus de rendu. Au lieu de dessiner l'arrière-plan à la position de l'objet joueur, de déplacer le joueur, puis de restituer le joueur à nouveau, vous devez simplement restituer l'arrière-plan une fois et dessiner tous les objets dessus. Pygame ne met à jour l'affichage que lorsque vous appelez pygame.display.update() ou pygame.display.flip().

Boucle de jeu révisée

Sur la base de ces informations, voici une version révisée de votre boucle de jeu qui sépare correctement le rendu des mises à jour de l'état des objets :

while 1:
    # Handle events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    # Update object states (based on input and time)
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        objects[0].move_left()    
    if keys[pygame.K_RIGHT]:
        objects[0].move_right()
    if keys[pygame.K_UP]:
        objects[0].move_up()
    if keys[pygame.K_DOWN]:
        objects[0].move_down()

    for num in range(num_objects - 1):
        objects[num + 1].rand_move()

    # Draw background
    screen.blit(background, (0, 0))

    # Draw scene
    for o in objects:
        screen.blit(o.image, o.pos)

    # Update display
    pygame.display.update()
    pygame.time.delay(100)

Caméra Système

La mise en œuvre d'un système de caméra dans Pygame nécessite quelques considérations supplémentaires :

  • Viewport : Définissez la zone de l'écran que la caméra affichera.
  • Cible : Spécifiez l'objet ou l'emplacement que la caméra va suivez.
  • Décalage : Calculez la différence entre le point de vue de la caméra et la position de la cible.

En gardant ces concepts à l'esprit, vous pouvez mettre en œuvre un système de caméra de base en modifiant la boucle de jeu comme suit :

# Add camera attributes
camera_viewport = (0, 0, screen_width, screen_height)
camera_target = characters[0]

# Update game loop to follow the camera
while 1:
    # ... (same event handling and object state update)

    # Calculate camera offset
    camera_offset_x = camera_target.pos.x - camera_viewport[0] - camera_viewport[2] / 2
    camera_offset_y = camera_target.pos.y - camera_viewport[1] - camera_viewport[3] / 2
    
    # Set the camera viewport
    screen.blit(background, (camera_offset_x, camera_offset_y), camera_viewport)
    
    # Render objects relative to the camera viewport
    for o in objects:
        screen.blit(o.image, (o.pos.x - camera_offset_x, o.pos.y - camera_offset_y))
    # ... (same display update)

Cette implémentation garantit que la caméra suit la cible, offrant un jeu dynamique environnement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn