如何在pygame中有两个key_输入方法?

2024-07-05 11:02:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现我只能有一种键输入方法。下面我有两种方法(movementsprite和movementspritevert),我发现我只能有一个工作。如果我同时启动两个,第一个运行,第二个什么也不做。有办法吗?我做错什么了吗?在

原始程序

----移动文件---

    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

-----主文件------]

^{pr2}$

------显示文件----

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)

----Full Code---


Tags: keyineventgetifdeftypeevents
1条回答
网友
1楼 · 发布于 2024-07-05 11:02:55

问题是事件.获取()从队列中删除事件(请参见docs)。所以,当你的第二个函数使用事件.获取(),队列中不存在任何事件,除非它们能够在两次调用之间的极短间隔内滑入。在

{{{1>在第二个函数中调用它,然后把它放在第二个函数中。在

解决这个问题的一个方法是

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

然后在events上使用for循环。在


编辑:阐明如何实施

很可能您的代码抛出了一个错误,因为在初始化pygame之前调用了pygame.event.get()。你可以用类似的东西

^{pr2}$

然后,从以下位置更改移动功能:

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:

关键是你每次使用事件.获取(),它将删除事件,因此您的下一个调用将不会获得相同的事件。基本上,如果你想让你所有的移动功能都使用一个按键,那么把事件保存为一个变量,并将其传递给函数。在

相关问题 更多 >