我试着用时间。时间()控制我的射弹的射速,但是在加入时间逻辑之后,我的玩家就不能再发射任何射弹了。我怎样才能让我的玩家每半秒左右只开火一次呢?你知道吗
下面是一个可行的例子
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
常量模块定义了几种颜色。非常感谢您的帮助!你知道吗
严格来说,答案是在
try
块中有time.Time()
,应该是time.time()
(全部小写)。这会引发异常,因此每当time.Time() - last_shot > player.fire_rate
求值时,try
块都不会运行。如果捕获到异常并抛出错误消息,而不仅仅是pass
,则这一点会更明显。你知道吗可能还有更多的问题,但是更深入地分析代码是困难的,因为我没有看到您在任何地方初始化
last_shot
,也没有player.fire_rate
。“最小完整示例”标准不仅适用于回答者,也适用于提问者。在基本调试中尽量隔离问题。你知道吗另一个注意事项是,while循环似乎只包含for循环,这使得它变得多余。如果这样做只是为了让程序在循环中反复运行直到合适的时间,那么
time.sleep()
可能是更好的方法。你知道吗带有裸
except
的try
是一种反模式,几乎不应该使用,因为它隐藏了try
子句中的所有错误,使代码难以调试。我会删除它并重新排列事件处理代码。你知道吗当按下箭头键时,仅根据该键更改速度向量,而不是创建新的投射实例。然后再次检查是否按了任何箭头键,如果计时器已完成,则创建一个投射物实例并传递当前速度向量。你知道吗
相关问题 更多 >
编程相关推荐