2013-04-16 18 views
20

私はパイゲーム1.9.2で試合をしています。 これは、船がゆっくりと下に移動して攻撃する悪人の5つの列の間を移動する失敗した単純なゲームです。私は船が左右の矢印キーで左右に動くようにしようとしています。ここに私のコードです:pygameでキーボード入力を取得するには?

keys=pygame.key.get_pressed() 
if keys[K_LEFT]: 
    location-=1 
    if location==-1: 
     location=0 
if keys[K_RIGHT]: 
    location+=1 
    if location==5: 
     location=4 

それはあまりにもうまくいきます。船はあまりにも速く動く。左または右の1つの場所だけを移動させることはほぼ不可能です。キーが押されるたびに船が1回だけ動くようにするにはどうすればいいですか? KEYDOWNイベントは、キーが押されたかを示し、一方、

答えて

32

あなたは、pygameのからイベントを取得し、代わりに、現在押され、あなたの鍵を与える(get_pressed()によって返されたキーを見ていると、KEYDOWNイベントに気を付けることができますそのフレーム)。

あなたのコードでは、ゲームが30fpsでレンダリングされ、左矢印キーを0.5秒間押し続けると、その場所を15回更新しています。ゲームループの強制最大フレームレートにのみ、あなたがすることができますカウンタによってベース

events = pygame.event.get() 
for event in events: 
    if event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_LEFT: 
      location -= 1 
     if event.key == pygame.K_RIGHT: 
      location += 1 

キーが押されている間に連続的な動きをサポートするために、あなたが何らかの制限を確立しなければならない、どちらかループの多くのティックを動かす。 、これが唯一のあなたは、あなたが移動した場合ので、ティッカーが10に設定されます(一回ごとに10枚のフレームを移動させます

if move_ticker > 0: 
    move_ticker -= 1 

move_ticker = 0 
keys=pygame.key.get_pressed() 
if keys[K_LEFT]: 
    if move_ticker == 0: 
     move_ticker = 10 
     location -= 1 
     if location == -1: 
      location = 0 
if keys[K_RIGHT]: 
    if move_ticker == 0: 
     move_ticker = 10  
     location+=1 
     if location == 5: 
      location = 4 

は次にどこかゲームループ中に、あなたはこのような何かをするだろう10フレーム後に再び移動できるようになります)

+0

私はこれを使用しようとしましたが、pygameがそのイベントを探していた瞬間にボタンを押しただけで問題になりました。私はそれが欲しい時には動かないだろう。 –

+2

ゲームループの各アップデートであなたのイベントを調べる必要があります。これをしていたのですか?あなたがそれらを読んだり、汲み取ったりするまで、イベントはPygameのイベントキューに残ります。 – Haz

+2

ダン、この回答はまさにあなたが求めていたものですが、イベントを使用すると速度をコントロールできればあなたが望むかもしれないあなたの船を連続的に移動することはできません。あなたは元のコードを保持することができ、一度押されたキーを検出すると、Nループの押されたボタンを簡単に無視することができます。 – pmoleri

-3

docsに記載されているとおり、clock.tick(10)を使用してください。

0

はこれを試してみてください:

keys=pygame.key.get_pressed() 
if keys[K_LEFT]: 
    if count == 10: 
     location-=1 
     count=0 
    else: 
     count +=1 
    if location==-1: 
     location=0 
if keys[K_RIGHT]: 
    if count == 10: 
     location+=1 
     count=0 
    else: 
     count +=1 
    if location==5: 
     location=4 

これはあなたが唯一の時間の1/10移動を意味します。それでも速く動くならば、あなたは「カウント」を設定する価値を増やすこともできます。 K_0とK_1はキーのみではないことを

ノートで
3
import pygame 
pygame.init() 
pygame.display.set_mode() 
while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit(); #sys.exit() if sys is imported 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_0: 
       print("Hey, you pressed the key, '0'!") 
      if event.key == pygame.K_1: 
       print("Doing whatever") 



、そうでない場合は、pygameのドキュメントを参照してください、それらのすべてを見るためには、

に入力した後 tabを打ちます

pygame。

(注:ファイアウォール後)は、アイドル状態のプログラムに入ります。 Kは資本でなければならないことに注意してください。また、pygameに表示サイズ(argsを渡さない)を指定しないと、コンピュータ画面/モニタのサイズが自動的に使用されます。ハッピーコーディング!

-3

上記の回答はすべて複雑すぎるため、変数を0だけ変更します。それがまだであれば1の代わりに、1 これは 10倍遅く船を作る速すぎ0.01 で変数を変更するこれはあなたがしようとしている場合は、船100倍遅く は、ちょうどFYIこの

keys=pygame.key.get_pressed() 
if keys[K_LEFT]: 
    location -= 0.1 #or 0.01 
    if location==-1: 
    location=0 
if keys[K_RIGHT]: 
    location += 0.1 #or 0.01 
    if location==5: 
     location=4 
+0

これは、すべての動きが整数値でなければならないという事実を除いて、機能します。丸めに入ることは変わらない。 pygame.KEYDOWNイベントを使用して私が探していた解決策、ボタンを押すごとに1つの動きでした。可能な場所が5つしかない場合はうまく機能します。 –

0

を試してみます船は

location-=1 
if location==-1: 
    location=0 

で画面の外にならないことを確認するために、あなたは、おそらくより良い

location -= 1 
location = max(0, location) 
を使用することができます3210

このように-1をスキップするとプログラムは中断しません

関連する問題