pygame.key.get_pressed() 中针对移动函数的问题
Issue in pygame.key.get_pressed() for movement function
我对 python 和编码还很陌生。尝试使用 pygame 编写一个简单的游戏时,我发现了一个我无法在移动函数中解决的问题。
我有一个函数使用 pygame 方法 get_pressed() 来设置玩家速度矢量的方向(见下文)。使用此代码,如果在游戏中我按住 a 然后按下 d 玩家表面会改变方向,即使我仍然按住 a 键,而如果我反其道而行之,玩家会继续向右移动,就好像我没有按下 a 键一样。
我知道这是由于函数中 if 语句的顺序造成的,我的问题是:有没有办法让玩家在这两种情况下都改变方向?
我真的希望问题很清楚,如果有人能帮助我,请提前致谢。
设置速度方向的函数:
def get_keys(self):
self.vel = vec(0, 0)
keys = pg.key.get_pressed()
if keys[pg.K_a]:
self.vel.x = -PLAYER_SPEED
if keys[pg.K_d]:
self.vel.x = PLAYER_SPEED
if keys[pg.K_w]:
self.vel.y = -PLAYER_SPEED
if keys[pg.K_s]:
self.vel.y = PLAYER_SPEED
if self.vel.x != 0 and self.vel.y != 0:
self.vel *= 0.7071
更新函数:
def update(self)
self.get_keys()
self.pos += self.vel * self.game.dt
self.rect.centerx = self.pos.x
self.rect.centery = self.pos.y
对于你想做的事情,你必须使用键盘事件。请注意,您希望在按下某个键后立即更改方向。这是和事件。例如:
import pygame
pygame.init()
window = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()
pos = pygame.Vector2(window.get_rect().center)
dx, dy = 0, 0
speed = 5
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
dx = -1
if event.key == pygame.K_d:
dx = 1
if event.key == pygame.K_w:
dy = -1
if event.key == pygame.K_s:
dy = 1
if event.type == pygame.KEYUP:
if (event.key == pygame.K_a and dx < 0) or (event.key == pygame.K_d and dx > 0):
dx = 0
if (event.key == pygame.K_w and dy < 0) or (event.key == pygame.K_s and dy > 0):
dy = 0
vel = pygame.Vector2(dx, dy)
if vel.x != 0 or vel.y != 0:
vel.scale_to_length(speed)
pos += vel
pos.x %= window.get_width()
pos.y %= window.get_height()
window.fill(0)
pygame.draw.circle(window, (255, 0, 0), pos, 20)
pygame.display.flip()
clock.tick(60)
pygame.quit()
exit()
我对 python 和编码还很陌生。尝试使用 pygame 编写一个简单的游戏时,我发现了一个我无法在移动函数中解决的问题。
我有一个函数使用 pygame 方法 get_pressed() 来设置玩家速度矢量的方向(见下文)。使用此代码,如果在游戏中我按住 a 然后按下 d 玩家表面会改变方向,即使我仍然按住 a 键,而如果我反其道而行之,玩家会继续向右移动,就好像我没有按下 a 键一样。 我知道这是由于函数中 if 语句的顺序造成的,我的问题是:有没有办法让玩家在这两种情况下都改变方向?
我真的希望问题很清楚,如果有人能帮助我,请提前致谢。
设置速度方向的函数:
def get_keys(self):
self.vel = vec(0, 0)
keys = pg.key.get_pressed()
if keys[pg.K_a]:
self.vel.x = -PLAYER_SPEED
if keys[pg.K_d]:
self.vel.x = PLAYER_SPEED
if keys[pg.K_w]:
self.vel.y = -PLAYER_SPEED
if keys[pg.K_s]:
self.vel.y = PLAYER_SPEED
if self.vel.x != 0 and self.vel.y != 0:
self.vel *= 0.7071
更新函数:
def update(self)
self.get_keys()
self.pos += self.vel * self.game.dt
self.rect.centerx = self.pos.x
self.rect.centery = self.pos.y
对于你想做的事情,你必须使用键盘事件。请注意,您希望在按下某个键后立即更改方向。这是和事件。例如:
import pygame
pygame.init()
window = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()
pos = pygame.Vector2(window.get_rect().center)
dx, dy = 0, 0
speed = 5
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
dx = -1
if event.key == pygame.K_d:
dx = 1
if event.key == pygame.K_w:
dy = -1
if event.key == pygame.K_s:
dy = 1
if event.type == pygame.KEYUP:
if (event.key == pygame.K_a and dx < 0) or (event.key == pygame.K_d and dx > 0):
dx = 0
if (event.key == pygame.K_w and dy < 0) or (event.key == pygame.K_s and dy > 0):
dy = 0
vel = pygame.Vector2(dx, dy)
if vel.x != 0 or vel.y != 0:
vel.scale_to_length(speed)
pos += vel
pos.x %= window.get_width()
pos.y %= window.get_height()
window.fill(0)
pygame.draw.circle(window, (255, 0, 0), pos, 20)
pygame.display.flip()
clock.tick(60)
pygame.quit()
exit()