0

キー入力の方法は1つしかありません。以下2つの方法(movementspriteとmovementspritevert)があります。1つの作業しかできないことがわかりました。両方を開始すると、一番上のものが実行され、2番目のものは何もしません。これを回避する方法はありますか?私は何か間違ったことをしていますか?

オリジナルプログラム

----移動ファイル------

    import pygame
    import os, sys
    from itertools import *
    from oryxsprites import *
    from oryxdisplay import *
    spritex = 320
    spritey = 320

    screen = pygame.display.set_mode((640, 640))
    def movementsprite():   

        global spritex

        keys = pygame.key.get_pressed()

        for event in pygame.event.get():
             if event.type == pygame.QUIT:
                 running = False
             elif event.type == pygame.KEYDOWN:

                 if event.key == pygame.K_RIGHT:
                     if spritex == 576:
                         spritex += 0
                     else:
                         spritex += 32 

                 elif event.key == pygame.K_LEFT:              
                     if spritex == 32:
                         spritex -= 0
                     else:
                         spritex -= 32

        return spritex
    def movementspritevert():   

        global spritey

        keys = pygame.key.get_pressed()

        for event in pygame.event.get():
             if event.type == pygame.QUIT:
                 running = False
             elif event.type == pygame.KEYDOWN:

                 if event.key == pygame.K_DOWN:
                     if spritey == 576:
                         spritey += 0
                     else:
                         spritey += 32 

                 elif event.key == pygame.K_UP:              
                     if spritey == 32:
                         spritey -= 0
                     else:
                         spritey -= 32

        return spritey

-------メインファイル------]

running = True

while running:

    backgroundmain()
    pygame.display.set_caption('OryxGame')
    #pygame.display.set_icon(grasstile)
    movementsprite()
    movementspritevert()

    pygame.display.flip()


    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False
             pygame.quit()

------表示ファイル----

def backgroundmain():
    spritex = movementsprite()
    spritey = movementspritevert()
    backdrop = pygame.Rect(0, 0, 640, 640) 
    screen.fill((50,50,50))
    playingfeildwidth = (32, 608)
    playingfeildheight = (32, 608)

    screen.blit(warrior1, (spritex, spritey))

------可能な解決策-------------

-メインファイル----

 while running:

    backgroundmain()
    pygame.display.set_caption('OryxGame')
    #pygame.display.set_icon(grasstile)
    movementsprite(events)
    movementspritevert(events)

    pygame.display.flip()


    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False
             pygame.quit()

-----ファイルの表示-----

def backgroundmain():
    events = pygame.event.get()
    spritex = movementsprite(events)
    spritey = movementspritevert(events)
    backdrop = pygame.Rect(0, 0, 640, 640) 
    screen.fill((50,50,50))
    playingfeildwidth = (32, 608)
    playingfeildheight = (32, 608)

------キー入力ファイル-----------

spritex = 320
spritey = 320
screen = pygame.display.set_mode((640, 640))
def movementsprite(events):  
    global spritex
    keys = pygame.key.get_pressed()

    for event in events:
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:

             if event.key == pygame.K_RIGHT:
                 if spritex == 576:
                     spritex += 0
                 else:
                     spritex += 32 

             elif event.key == pygame.K_LEFT:              
                 if spritex == 32:
                     spritex -= 0
                 else:
                     spritex -= 32

    return spritex
def movementspritevert(events):   
    global spritey
    keys = pygame.key.get_pressed()

    for event in events:
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:

             if event.key == pygame.K_DOWN:
                 if spritey == 576:
                     spritey += 0
                 else:
                     spritey += 32 

             elif event.key == pygame.K_UP:              
                 if spritey == 32:
                     spritey -= 0
                 else:
                     spritey -= 32

    return spritey

- -エラー - -

Traceback (most recent call last):
  File "C:\Users\Eric\Dropbox\oryxgame\oryxgame.py", line 12, in <module>
    backgroundmain()
  File "C:\Users\Eric\Dropbox\oryxgame\oryxdisplay.py", line 11, in backgroundmain
    spritey = movementspritevert(events)
TypeError: movementspritevert() takes no arguments (1 given)

----完全なコード----

4

1 に答える 1

3

問題は、 event.get() がキューからイベントを削除することです ( docsを参照)。したがって、2 番目の関数が event.get() を使用する場合、呼び出し間の非常に短い間隔でイベントが滑り込まない限り、キューにイベントは残りません。

この問題を実際に確認するには、最初の関数で print event after 呼び出しfor event in pygame.event.get()を入れてから、2 番目の関数で試してみてください。

これを修正する1つの方法は

    events = pygame.event.get()
    function1(events)
    function2(events)

次に、代わりに for ループ オーバーを使用しますevents


編集:実装方法を明確にする

pygame.event.get()pygame を初期化する前に が呼び出されたため、コードがエラーをスローした可能性があります。次のようなものを使用できます。

def backgroundmain():
    events = pygame.event.get()                #save events
    spritex = movementsprite(events)           #added events arg
    spritey = movementspritevert(events)       #added events arg
    backdrop = pygame.Rect(0, 0, 640, 640) 
    screen.fill((50,50,50))
    playingfeildwidth = (32, 608)
    playingfeildheight = (32, 608)

    screen.blit(warrior1, (spritex, spritey))

次に、移動関数を次のように変更します。

def movementspritevert():   

    #Do stuff ...

    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:

これに:

def movementspritevert(events):   

    #Do stuff ...

    for event in events:
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:

重要なのは、event.get() を使用するたびにイベントが削除されるため、次の呼び出しで同じイベントが取得されないことです。基本的に、すべての移動関数で 1 つのキー押下を使用する場合は、イベントを変数として保存し、それを関数に渡します。

于 2012-05-23T02:03:31.470 に答える