1

好吧,我在屏幕上遇到了精灵移动的问题。我有某种方式我希望事情发生如下:

  • 当我按下左移动键并按住它的同时按下右移动键,我希望精灵向右移动,直到我的手指离开右键,然后它会继续向左直到我也从左侧移开手指移动键。
  • 我也希望这种方法用于向上/向下键
  • 除此之外,当我按下向上或向下键之一,然后按下左/右键之一时,我希望看到精灵向左或向右移动,直到其中一个也未被按下。

总而言之,我希望最近的方向键按下优先移动,当它未按下时,我希望下一个最近按下的键优先移动。我也不想要对角线运动,但到目前为止这还不是问题。

到目前为止,这是我的代码

m=pygame.key.get_pressed()
if m[K_d]:
    movey=0
    movex=speed
elif m[K_a]:
    movey=0
    movex=-speed
elif m[K_w]:
    movex=0
    movey=-speed            
elif m[K_s]:
    movex=0
    movey=speed 

这完成了我想要的 50%。问题是,代码本身优先考虑正在发生的事情,所以结果是当我按下“A”键时,我向左移动,然后同时按下“D”键,我向右移动。然后,如果我只是按“D”键,我会向右移动,但是当我也按“A”键时,当我想在那个点向左移动时,我会继续向右移动。我尝试过 if/not/and 嵌套不同的方式,但到目前为止都失败了。

我该如何解决?

编辑:这是我在 Bartlomiej 的帮助下想出的。

    if e.type==KEYDOWN:     
        if e.key==pygame.K_a:              
            keylist.append(1)
            #keylist.reverse()
            print keylist[-1:]
        if e.key==pygame.K_d:
            keylist.append(2)
            #keylist.reverse()
            print keylist[-1:]

    if e.type==pygame.KEYUP:
        if e.key==pygame.K_a:                
            keylist.remove(1)
            print keylist                
        if e.key==pygame.K_d:
            keylist.remove(2)
            print keylist

    if keylist[-1:]==[1]:
        walk=[-spd, 0]
        print 'WTF MOVE LEFT'
    elif keylist[-1:]==[2]:
        walk=[spd, 0]
        print 'WTF MOVE RIGHT'
    else:
        print 'WTFFFFFF'
        walk=[0, 0]

这可以按我的意愿工作,我现在需要做的就是将其最小化并使其作为一个函数更优雅,但我现在明白了。再次感谢 Bartlomiej 帮助我更好地理解 python 和编码。真的很感激。

4

1 回答 1

1

我总是这样解决问题:(部分解决方案):

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()
    if event.type == KEYDOWN:     
        if event.key == K_ESCAPE:
            pygame.quit()
            sys.exit()
        if event.key == pygame.K_LEFT:                
            x_speed=3    
        if event.key == pygame.K_RIGHT:
            player.moveright()
            x_speed=-3             
        if event.key == pygame.K_UP:                
            y_speed=3               
        if event.key == pygame.K_DOWN:                
            y_speed=-3

    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT and x_speed == 3:                
            x_speed=0                
        if event.key == pygame.K_RIGHT and x_speed == -3:
            x_speed=0                
        if event.key == pygame.K_UP and y_speed == 3:
            y_speed=0                
        if event.key == pygame.K_DOWN and y_speed == -3:
            y_speed=0

当未按下前一个键时,这不会停止移动。

编辑:这并非不可能,只是没那么有用。例如,您可以有 2 个模仿堆栈的列表。当列表为空时,您的角色将不会移动。每次按下键时,您都会将键附加到列表的末尾。每次键入时,您都会从列表中删除该键。这样,最近按下的键将位于列表的末尾,如果您取消按下最后一个最近的键,也将位于列表的末尾。

一个小例子:

keylist = []
for event in pygame.event.get():
    if event.type == KEYDOWN:     
        if event.key == pygame.K_LEFT:                
            keylist.append(-1)    
        if event.key == pygame.K_RIGHT:
            keylist.append(1)            

    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT:                
            keylist.reverse().remove(-1)                
        if event.key == pygame.K_RIGHT:
            keylist.reverse().remove(1)

在 move 方法中,您可以尝试以下操作:如果列表中的最后一个元素存在,则将其移动到正确的方向。

if(not keylist[-1:]):
    character.move(direction=keylist[-1])
else:
    character.move(direction=0)
于 2012-12-10T09:58:03.500 回答