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]

これは私が望むように機能し、今私がする必要があるのは、それを最小化して関数としてよりエレガントにすることだけですが、今はアイデアを思いつきました。Python とコーディング全般をもう少しよく理解するのを手伝ってくれた Bartlomiej に感謝します。心から感謝する。

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 に答える