好吧我在屏幕上有精灵移动的问题。我有一种方式可以让事情发生如下:
总而言之,我希望最近的方向键按下以获取移动优先级,并且当它未被按下时,我希望按下下一个最近的键以获取移动优先级。我也不想要对角线移动,但到目前为止这不是问题。
这是我到目前为止的代码
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和编码。真的很感激。
答案 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)