画面上のスプライトの動きに問題があります。次のように物事を実現したい特定の方法があります。
- 左の移動キーを押し、それを押したまま右の移動キーを押すと、右のキーから指を離すまでスプライトを右に移動させ、左から指を離すまで左に続けます移動キー。
- 上下キーにもこのメソッドが欲しい
- これに加えて、上または下のキーのいずれかを押してから、左/右のキーのいずれかを押すと、それらのいずれかが押されなくなるまで、スプライトが左または右に移動するのを見たいと思います。
要約すると、方向キーを最後に押したときに移動を優先し、押していないときは次に最後に押したキーを移動優先にしたいということです。斜めの動きもあまりしたくないのですが、今のところ問題ありません。
ここに私のコードがあります
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 に感謝します。心から感謝する。