Maison >développement back-end >Tutoriel Python >Comment mettre en œuvre un mécanisme de temps de recharge pour éviter les tirs excessifs de balles ?

Comment mettre en œuvre un mécanisme de temps de recharge pour éviter les tirs excessifs de balles ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-21 06:38:301042parcourir

How to Implement a Cooldown Mechanism to Prevent Excessive Bullet Firing?

Comment empêcher plusieurs tirs de balles simultanément

Dans le code d'origine, plusieurs balles étaient tirées en même temps en raison du fait que le pygame La fonction .key.get_pressed() renvoie True tant qu'une touche est enfoncée. Ce comportement convient au contrôle des mouvements du joueur mais pas au tir de balles, où vous souhaitez qu'une seule balle soit tirée à chaque fois qu'une touche est enfoncée.

Pour résoudre ce problème, nous pouvons profiter du pygame.KEYDOWN événement, qui ne se produit qu’une seule fois lorsqu’une touche est initialement enfoncée. En utilisant cet événement au lieu de pygame.key.get_pressed(), nous pouvons garantir qu'une seule balle est tirée lorsque la barre d'espace est enfoncée.

De plus, nous pouvons implémenter un mécanisme de temps de recharge simple pour empêcher une balle à tir rapide. tournage. Cela peut être fait en introduisant une variable appelée next_bullet_threshold, qui représente l'heure au plus tôt à laquelle la prochaine balle peut être tirée. Chaque fois qu'une balle est tirée, nous mettons à jour next_bullet_threshold à l'heure actuelle plus la période de recharge souhaitée. En vérifiant si l'heure actuelle est supérieure à next_bullet_threshold, nous pouvons empêcher le tir de balles en dehors de la période de recharge souhaitée.

Voici le code modifié avec le mécanisme de recharge implémenté :

<code class="python">import pygame
pygame.init()

red = 255,0,0
blue = 0,0,255
black = 0,0,0

screenWidth = 800
screenHeight = 600

gameDisplay = pygame.display.set_mode((screenWidth,screenHeight))        ## screen width and height
pygame.display.set_caption('JUST SOME BLOCKS')       ## set my title of the window

clock = pygame.time.Clock()

class player():       ## has all of my attributes for player 1
    def __init__(self,x,y,width,height):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.vel = 5
        self.left = False
        self.right = False
        self.up = False
        self.down = False

class projectile():     ## projectile attributes
    def __init__(self,x,y,radius,colour,facing):
        self.x = x
        self.y = y
        self.radius = radius
        self.facing = facing
        self.colour = colour
        self.vel = 8 * facing       # speed of bullet * the direction (-1 or 1)

    def draw(self,gameDisplay):
        pygame.draw.circle(gameDisplay, self.colour , (self.x,self.y),self.radius)      ## put a 1 after that to make it so the circle is just an outline

def redrawGameWindow():
    for bullet in bullets:      ## draw bullets
        bullet.draw(gameDisplay)

    pygame.display.update()   

#mainloop

player1 = player(300,410,50,70)     # moves the stuff from the class (when variables are user use player1.var)
bullets = []

run = True
next_bullet_threshold = 0  # Initialize the cooldown threshold
bullet_cooldown = 500  # Set the desired cooldown period in milliseconds
while run == True:
    clock.tick(27)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    for bullet in bullets:
        if bullet.x < screenWidth and bullet.x > 0 and bullet.y < screenHeight and bullet.y > 0: ## makes sure bullet does not go off screen
            bullet.x += bullet.vel
        else:
            bullets.pop(bullets.index(bullet))


    keys = pygame.key.get_pressed()     ## check if a key has been pressed

    ## red player movement   
    if keys[pygame.K_w] and player1.y > player1.vel:    ## check if that key has been pressed down (this will check for w)     and checks for boundry
        player1.y -= player1.vel            ## move the shape in a direction
        player1.up = True
        player1.down = False

    if keys[pygame.K_a] and player1.x > player1.vel:      ### this is for a 
        player1.x -= player1.vel
        player1.left = True
        player1.right = False

    if keys[pygame.K_s] and player1.y < screenHeight - player1.height - player1.vel: ## this is for s
        player1.y += player1.vel
        player1.down = True
        player1.up = False

    if keys[pygame.K_d] and player1.x < screenWidth - player1.width - player1.vel:   ## this is for d                          
        player1.x += player1.vel
        player1.right = True
        player1.left = False

    if keys[pygame.K_SPACE]:     # shooting with the space bar
        current_time = pygame.time.get_ticks()
        if current_time >= next_bullet_threshold:  # Check the cooldown timer
            if player1.left == True:   ## handles the direction of the bullet
                facing = -1
            else:
                facing = 1  

            if len(bullets) < 5:    ## max amounts of bullets on screen
                bullets.append(projectile(player1.x + player1.width //2 ,player1.y + player1.height//2,6,black,facing))   ##just like calling upon a function
                next_bullet_threshold = current_time + bullet_cooldown  # Update cooldown timer


    ## level


    gameDisplay.fill((0,255,0))        ### will stop the shape from spreading around and will have a background
    pygame.draw.rect(gameDisplay,(red),(player1.x,player1.y,player1.width,player1.height))  ## draw player
    pygame.display.update()
    redrawGameWindow()

pygame.quit()</code>

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