我正在尝试使用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模块定义了几种颜色。任何帮助深表感谢!
答案 0 :(得分:2)
好吧,严格来说,答案是您在time.Time()
块中有try
,应该为time.time()
(全部为小写)。这将引发异常,因此任何时候time.Time() - last_shot > player.fire_rate
被评估时,try
块都不会运行。如果您捕获了异常并引发了错误消息,而不仅仅是pass
,就会更加明显。
可能还有其他问题,但是很难对代码进行更深入的分析,因为我看不到您在任何地方都初始化last_shot
或player.fire_rate
。 “最小的完整示例”标准不仅适用于应答者,也适用于询问者。基本调试中尽可能地隔离问题。
请注意,您的while循环似乎只包含for循环,从而使其多余。如果这样做是为了让程序一次又一次地循环运行直到合适的时间,那么time.sleep()
可能是一种更好的方法。
答案 1 :(得分:1)
带有裸露try
的{{1}}是反模式,几乎不应该使用,因为它会将except
子句中的所有错误隐藏起来,并使代码难以调试。我将其删除并重新排列事件处理代码。
按下箭头键时,仅根据键更改速度矢量,而不创建新的射弹实例。然后再次检查是否按下了任何箭头键,以及计时器是否已完成,请创建一个射弹实例并传递当前速度矢量。
try