2 votes

Pourquoi pygame.time.set_timer() ne fonctionne-t-il plus lorsque je lui donne un paramètre supérieur à 16 milisecondes ?

J'ai un événement utilisateur personnalisé que j'ai assigné à la variable enemy_fire et le régler pour qu'il s'active toutes les 100 ms avec pygame.time.set_timer(enemy_fire, 100) . Cependant, cela ne fonctionne pas. J'ai essayé de le régler sur 10 ms : pygame.time.set_timer(enemy_fire, 10) et cela a fonctionné, et j'ai continué à jouer avec le paramètre de temps jusqu'à ce que je trouve le seuil dans lequel il a cessé de fonctionner, et j'ai constaté que tout ce qui est supérieur à 16 ms ne fonctionne pas. J'ai lu la documentation, et je suis presque sûr que j'utilise cette fonction correctement. Cela me semble être un comportement étrange, je ne sais pas vraiment pourquoi cela se produit.

Voici la partie principale de mon code :

import pygame
import gametools
import players
import enemies
from sys import exit

# initilaization
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption('Bullet hell')
clock = pygame.time.Clock()

# Player
player = players.Player()
enemy = enemies.Enemy()

# Background
back_surf = pygame.image.load('sprites/backgrounds/background.png').convert()

enemy_fire = pygame.USEREVENT + 1

# main game loop
while True:

    pygame.time.set_timer(enemy_fire, 100)
    # event loop
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == enemy_fire:
            print('fire')
            enemy.attack(screen)

    # display background
    screen.blit(back_surf, (0, 0))

    player.draw(screen)
    player.update(screen)

    enemy.draw(screen)
    enemy.update()

    enemy.collision(enemy.rect, player.bullets)

    pygame.display.update()
    clock.tick(60)

2voto

Rabbid76 Points 52493

Vous devez appeler pygame.time.set_timer(enemy_fire, 100) avant la boucle d'application, mais pas dans la boucle. Lorsque vous appelez pygame.time.set_timer() dans la boucle, elle redémarre continuellement et ne se déclenche jamais, à moins que vous ne définissiez un intervalle de temps plus rapide que l'intervalle de la boucle d'application. Comme la boucle d'application est limitée par clock.tick(60) soit environ 16 millisecondes (1000/60).

pygame.time.set_timer(enemy_fire, 100)       # <-- INSERT

# main game loop
while True:

    # pygame.time.set_timer(enemy_fire, 100)   <-- DELETE

    # event loop
    for event in pygame.event.get():
        # [...]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X