我已经写了下面的代码,在我看来它应该工作,但它似乎"firedir“经常被设置为”面向“,而不仅仅是鼠标点击。用这段代码,当字符改变方向时,或面对屏幕上的任何投射物也会改变方向。(这是Python3.3版)
我写它的方式有什么问题?有什么更好的方法来实现这一点吗?
def update(char1, laser_list, facing, firedir):
keys = pygame.key.get_pressed()
if (keys[pygame.K_LEFT] or keys[pygame.K_a]):
char1.rect.x -= 2
facing = "left"
elif (keys[pygame.K_DOWN] or keys[pygame.K_s]):
char1.rect.y += 2
facing = "down"
elif (keys[pygame.K_UP] or keys[pygame.K_w]):
char1.rect.y -= 2
facing = "up"
elif (keys[pygame.K_RIGHT] or keys[pygame.K_d]):
char1.rect.x += 2
facing = "right"
if laser_list:
#Move the laser
if firedir == "up":
laser.rect.y -= 4
elif firedir == "down":
laser.rect.y += 4
elif firedir == "left":
laser.rect.x -= 4
elif firedir == "right":
laser.rect.x += 4
return(facing)
#main loop
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
if event.type == pygame.MOUSEBUTTONDOWN:
if not laser_list:
laser = Laser(facing)
laser.rect.x = (char1.rect.x + 10)
laser.rect.y = (char1.rect.y + 10)
all_sprites_list.add(laser)
laser_list.add(laser)
firedir = facing
#update sprites
facing = update(char1, laser_list, facing, facing) 发布于 2014-05-18 00:13:31
这个问题是,您将facing作为firedir传递,此时您应该读取传递给Laser构造函数的面向。我不知道保存在哪里(因为您没有显示Laser类定义),但我认为您想让update执行如下操作:
def update(char1, laser_list): # fewer parameters
# key reading stuff, as before, which sets the local variable `facing`
for laser in laser_list: # loop over all lasers in the list
if laser.firedir == "up": # check an attribute of the laser for its direction
laser.rect.y -= 4
elif laser.firedir == "down":
laser.rect.y += 4
elif laser.firedir == "left":
laser.rect.x -= 4
elif laser.firedir == "right":
laser.rect.x += 4
return facing # the returned facing will be used for lasers fired in the next frame!另一种可能比较容易的方法是在激光上存储一个velocity矢量,而不是一个方向字符串。然后,您可以使用相同的更新代码,不管激光瞄准的方向(即使是对角线,如果你允许的话,将只是工作)。我不知道Laser设置代码是什么,但是update逻辑是:
laser.rect.x += laser.velocity.x
laser.rect.y += laser.velocity.yhttps://stackoverflow.com/questions/23716919
复制相似问题