Python如何延迟子弹射击

时间:2018-01-20 13:22:43

标签: python pygame

提前感谢您的时间。

如果我使用空格键发射子弹,则会创建一连串子弹。如果我在'if keys [pygame.K_SPACE]:'里面设置time.sleep()的延迟,那么它也会将循环冻结设定的秒数。我怎么能这样做,所以一次只发射一颗子弹?这是我的游戏循环的副本,请告诉我是否需要更多代码:

def game_loop():
    global pause
    x = (display_width * 0.2)
    y = (display_height * 0.2)

    x_change = 0
    y_change = 0

    blob_speed = 3

    velocity = [2, 2]

    pos_x = display_width/1.2
    pos_y = display_height/1.2

    gameExit = False
    while not gameExit:
        for event in pygame.event.get():#monitors hardware movement/ clicks
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        pos_x += velocity[0]
        pos_y += velocity[1]

        if pos_x + blob_width > display_width or pos_x < 601:
            velocity[0] = -velocity[0]

        if pos_y + blob_height > display_height or pos_y < 0:
            velocity[1] = -velocity[1]

# Checks to see if any keys are held down and remembers them with the variable keys.
        keys = pygame.key.get_pressed()

        for b in range(len(bullets)):
            bullets[b][0] += 6

        for bullet in bullets:
            if bullet[0] > 1005:
                bullets.remove(bullet)

        if keys[pygame.K_SPACE]:
            bullets.append([x+25, y+24])

# If the player is holding down one key or the other the blob moves in that direction
        if x < 0:
            x = 0
        if keys[pygame.K_a]:
            x_change = -blob_speed
        if x > 401 - blob_width:
            x = 401 - blob_width
        if keys[pygame.K_d]:
            x_change = blob_speed
        if keys[pygame.K_p]:
            pause = True
            paused()


# If the player is holding down both or neither of the keys the blob stops
        if keys[pygame.K_a] and keys[pygame.K_d]:
            x_change = 0
        if not keys[pygame.K_a] and not keys[pygame.K_d]:
            x_change = 0

        if y < 0:
            y = 0
        if keys[pygame.K_w]:
            y_change = -blob_speed
        if y > display_height - blob_height:
            y = display_height - blob_height
        if keys[pygame.K_s]:
            y_change = blob_speed


        if keys[pygame.K_w] and keys[pygame.K_s]:
            y_change = 0
        if not keys[pygame.K_w] and not keys[pygame.K_s]:
            y_change = 0


        #print(event)
        # Reset x and y to new position
        x += x_change
        y += y_change

        gameDisplay.fill(blue)  #changes background surface
        pygame.draw.line(gameDisplay, black, (601, display_height), (601, 0), 3)
        pygame.draw.line(gameDisplay, black, (401, display_height), (401, 0), 3)
        blob(pos_x, pos_y)
        blob(x, y)

        for bullet in bullets:
            gameDisplay.blit(bulletpicture, pygame.Rect(bullet[0], bullet[1], 0, 0))

        pygame.display.update() #update screen
        clock.tick(120)#moves frame on (fps in parameters)

1 个答案:

答案 0 :(得分:6)

这是一个没有课程的答案。您只需要存储子弹被触发时的上一次,从当前时间中减去它并检查它是否超过某个时间限制(在此示例中为500 ms)以查看我们是否已准备好开火

import pygame


def game_loop():
    pygame.init()
    gameDisplay = pygame.display.set_mode((640, 480))
    clock = pygame.time.Clock()
    bulletpicture = pygame.Surface((10, 5))
    bulletpicture.fill(pygame.Color('sienna1'))
    bullets = []
    x = 50
    y = 240
    previous_time = pygame.time.get_ticks()

    gameExit = False
    while not gameExit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True

        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            current_time = pygame.time.get_ticks()
            # We're ready to fire when 500 ms have passed.
            if current_time - previous_time > 500:
                previous_time = current_time
                bullets.append([x+25, y+24])

        remaining_bullets = []
        for bullet in bullets:
            bullet[0] += 6  # Move the bullet.
            if bullet[0] < 500:  # Filter out the bullets.
                remaining_bullets.append(bullet)
        bullets = remaining_bullets

        gameDisplay.fill((30, 30, 30))

        for bullet in bullets:
            gameDisplay.blit(bulletpicture, pygame.Rect(bullet[0], bullet[1], 0, 0))

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

game_loop()
pygame.quit()