Pygame 1.9.2でゲームを作成しています。これは、船がゆっくりと下に向かって攻撃する5人の悪者の列の間を移動する単純なゲームです。船が左右の矢印キーで左右に動くようにしようとしています。ここに私のコードがあります:
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か所だけを動かすことはほぼ不可能です。キーを押すたびに船が一度だけ移動するようにするにはどうすればよいですか?
Pygameからイベントを取得して、KEYDOWN
イベントに注意することができます。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
キーが押されている間、連続的な動きをサポートするには、ゲームループの強制最大フレームレートに基づいて、または多くのティックごとにのみ移動できるカウンターによって、何らかの制限を設定する必要がありますループ。
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
次に、ゲームループのどこかで、次のようなことを行います。
if move_ticker > 0:
move_ticker -= 1
これにより、10フレームごとに1回しか移動できません(移動すると、ティッカーは10に設定され、10フレーム後に再び移動できるようになります)
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")
K_0とK_1が唯一のキーではないことに注意してください。それらのすべてを確認するには、pygameのドキュメントを参照してください。そうでない場合は、入力後にtab
pygame。
(pygameの後の。に注意してください)アイドルプログラムに。 Kは大文字でなければならないことに注意してください。また、pygameに表示サイズ(引数を渡さない)を指定しない場合、コンピューターの画面/モニターのサイズが自動的に使用されることに注意してください。ハッピーコーディング!
船が画面から消えないようにしようとしているなら
location-=1
if location==-1:
location=0
あなたはおそらくより良い使用することができます
location -= 1
location = max(0, location)
このように-1をスキップすると、プログラムは壊れません
これを試して:
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しか移動しないことを意味します。それでも高速に移動する場合は、「count」に設定した値も増やしてみてください。