【发布时间】:2020-05-16 15:13:59
【问题描述】:
我在所有游戏中都注意到一个奇怪的事情,即如果我移动,我的玩家会停止射击,无论是当我移动时玩家已经在射击,还是当我尝试射击时玩家已经在移动,如果我移动,拍摄停止。这是我在最近制作的一款游戏中用来移动玩家的代码:
def move(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_d]:
self.x += self.speed
if keys[pygame.K_a]:
self.x -= self.speed
为了拍摄,我这样做:
def handle_events():
if event.type == pygame.MOUSEBUTTONDOWN:
game.bullets.append(Bullet())
任何帮助将不胜感激。 还有一个旁注:如果有人知道一般代码中可能导致这种情况的某些东西(因为它发生在我所有的游戏中),请发表评论,以便我可以用相关代码更新问题,因为现在我不知道可能是什么导致这。
编辑:我最近注意到的一点是玩家在被重力拉下时仍然可以射击(从技术上讲,它仍然在移动)。所以我猜测在我按下键(任何键,而不仅仅是我在代码中包含的键)时会发生一些事情,这会导致玩家无法射击。
我的handle_evnets() 函数实际上只是处理关闭游戏和按下鼠标按钮。无论如何,这是代码:
def handle_events():
for event in events:
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
game.bullets.append(Bullet())
这是添加到game.bullets if MOUSEBUTTONDOWN 的子弹类
class Bullet:
def __init__(self):
self.pos = [(player.x - 10 - scroll[0]), (player.y + 15 - scroll[1])]
self.height = 3
self.width = 20
self.bullet = pygame.Surface((self.width, self.height)).convert_alpha()
self.bullet.fill((255, 255, 255))
self.dir = [(mouse.x - (player.x - 10 - scroll[0])), (mouse.y - (player.y + 15 - scroll[1]))]
self.distance = math.hypot(self.dir[0], self.dir[1])
self.dir = [(self.dir[0]/ self.distance), (self.dir[1]/ self.distance)]
angle = math.degrees(math.atan2((-self.dir[1]), self.dir[0]))
self.bullet = pygame.transform.rotate(self.bullet, (angle))
self.speed = 10
这是 Game 类,子弹添加到 shoot_bullet() 函数后会发生什么。
class Game:
def __init__(self):
self.bullets = []
def shoot_bullet(self):
for bullet in self.bullets:
bullet.pos[0] += bullet.dir[0] * bullet.speed
bullet.pos[1] += bullet.dir[1] * bullet.speed
D.blit(bullet.bullet, (bullet.pos[0], bullet.pos[1]))
【问题讨论】:
-
如果没有看到
move()和handle_events()如何链接在一起,就无法回答 -
Move 不是由 handle_events() 函数处理的(它由“pygame.key.get_pressed()”完成)所以我猜它们之间没有联系,但对于由 handle_event 函数处理的子弹,我已经更新了问题
-
在主循环中是否同时调用了
move()和handle_events()总是?创建子弹时,我还会打印Bullet.pos。也许子弹正在发射,但不知何故他们不在屏幕上。scroll[]什么时候更新? -
我尝试在移动时打印 bullet.pos,但它没有显示任何内容,因为“game.bullets”列表为空。我认为它真正归结为“pygame.MOUSEBUTTONDOWN”如果按下任何键都不起作用。