关键优先事项的精灵运动问题

时间:2012-12-10 07:20:51

标签: python pygame key game-physics

好吧我在屏幕上有精灵移动的问题。我有一种方式可以让事情发生如下:

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

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

这是我到目前为止的代码

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 /和嵌套不同的方法但到目前为止都失败了。

我该如何解决这个问题?

编辑:这是我在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和编码。真的很感激。

1 个答案:

答案 0 :(得分: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个模仿堆栈的列表。当列表为空时,您的角色将不会移动。使用每个keydown,您可以将密钥附加到列表末尾。每个密钥,您从列表中删除密钥。这样,按下的最新按键将位于列表的末尾,如果您取消按下最后一个按键也将位于列表的末尾。

一个小例子:

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)

在移动方法中你试试这个: 如果存在,则获取列表中的最后一个元素,向正确的方向移动字符。

if(not keylist[-1:]):
    character.move(direction=keylist[-1])
else:
    character.move(direction=0)