如何使用time.Time()控制射弹发射率

时间:2018-08-22 16:22:38

标签: python pygame

我正在尝试使用time.Time()来控制我的弹丸的射速,但是在输入了时间逻辑之后,我的玩家根本无法射击任何弹丸。如何才能使播放机每半秒左右发射一次?

以下是可行的示例;

主要游戏模块

import pygame
from constants import *
from player import Player
from Projectile import Projectiles
import time

pygame.init()

screen = pygame.display.set_mode([500, 500])

pygame.display.set_caption('Labyrinth')

# Spawn player

player = Player(50, 50)
all_sprites_list = pygame.sprite.Group()
all_sprites_list.add(player)

projectile_list = pygame.sprite.Group()

clock = pygame.time.Clock()

done = False


# ----- Event Loop

while not done:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        elif event.type == pygame.KEYDOWN:
            if event.key == ord('a'):
                player.changespeed(-3, 0)
            elif event.key == ord('d'):
                player.changespeed(3, 0)
            elif event.key == ord('w'):
                player.changespeed(0, -3)
            elif event.key == ord('s'):
                player.changespeed(0, 3)

            elif event.key == pygame.K_LEFT:
                projectile = Projectiles(player.rect.x, player.rect.y, -5, 0)
            elif event.key == pygame.K_RIGHT:
                projectile = Projectiles(player.rect.x, player.rect.y, 5, 0)
            elif event.key == pygame.K_UP:
                projectile = Projectiles(player.rect.x, player.rect.y, 0, -5)
            elif event.key == pygame.K_DOWN:
                projectile = Projectiles(player.rect.x, player.rect.y, 0, 5)

            try:
                if projectile:
                    if time.Time() - last_shot > player.fire_rate:
                        projectile_list.add(projectile)
                        last_shot = time.Time()

            except:
                pass

        elif event.type == pygame.KEYUP:
            if event.key == ord('a'):
                player.changespeed(3, 0)
            elif event.key == ord('d'):
                player.changespeed(-3, 0)
            elif event.key == ord('w'):
                player.changespeed(0, 3)
            elif event.key == ord('s'):
                player.changespeed(0, -3)


# ----- Game Logic

    all_sprites_list.update()
    projectile_list.update()



    screen.fill(GREEN)

    all_sprites_list.draw(screen)
    projectile_list.draw(screen)


    pygame.display.flip()

    clock.tick(60)

pygame.quit()

播放器模块

from constants import *
import pygame
import time
from datetime import datetime, timedelta

class Player(pygame.sprite.Sprite):


    def __init__(self, x, y):

        super().__init__()

        self.image = pygame.Surface([15, 15])
        self.image.fill(BLACK)

        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.fire_rate = 1

        self.change_x = 0
        self.change_y = 0

    def changespeed(self, x, y):
        self.change_x += x
        self.change_y += y

    def update(self):
        self.rect.x += self.change_x
        self.rect.y += self.change_y

射弹模块

import pygame
from constants import *

class Projectiles(pygame.sprite.Sprite):

    def __init__(self, x, y, x_speed, y_speed):

        super().__init__()

        self.image = pygame.Surface([4, 4])
        self.image.fill(RED)

        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.x_speed = x_speed
        self.y_speed = y_speed



    def update(self):

        self.rect.x += self.x_speed
        self.rect.y += self.y_speed

constants模块定义了几种颜色。任何帮助深表感谢!

2 个答案:

答案 0 :(得分:2)

好吧,严格来说,答案是您在time.Time()块中有try,应该为time.time()(全部为小写)。这将引发异常,因此任何时候time.Time() - last_shot > player.fire_rate被评估时,try块都不会运行。如果您捕获了异常并引发了错误消息,而不仅仅是pass,就会更加明显。

可能还有其他问题,但是很难对代码进行更深入的分析,因为我看不到您在任何地方都初始化last_shotplayer.fire_rate。 “最小的完整示例”标准不仅适用于应答者,也适用于询问者。基本调试中尽可能地隔离问题。

请注意,您的while循环似乎只包含for循环,从而使其多余。如果这样做是为了让程序一次又一次地循环运行直到合适的时间,那么time.sleep()可能是一种更好的方法。

答案 1 :(得分:1)

带有裸露try的{​​{1}}是反模式,几乎不应该使用,因为它会将except子句中的所有错误隐藏起来,并使代码难以调试。我将其删除并重新排列事件处理代码。

按下箭头键时,仅根据键更改速度矢量,而不创建新的射弹实例。然后再次检查是否按下了任何箭头键,以及计时器是否已完成,请创建一个射弹实例并传递当前速度矢量。

try