Python 不知道为什么按键不起作用

Python 不知道为什么按键不起作用,python,pygame,Python,Pygame,按程序中的D键时,我很难做出反应。我会展示,然后解释。不相干的事情省略了 Main.py while True: process(Cursor,movie,music) Effects.List.draw(screen) pygame.display.flip() 类.py class BaseClass(pygame.sprite.Sprite): allsprites = pygame.sprite.Group() def __init__(sel

按程序中的D键时,我很难做出反应。我会展示,然后解释。不相干的事情省略了

Main.py

while True:
    process(Cursor,movie,music)

    Effects.List.draw(screen)
    pygame.display.flip()
类.py

class BaseClass(pygame.sprite.Sprite):
    allsprites = pygame.sprite.Group()
    def __init__(self,x,y,image_string):

        pygame.sprite.Sprite.__init__(self)
        BaseClass.allsprites.add(self)

        self.image = pygame.image.load(image_string)

        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y


    def destroy(self, ClassName):
        ClassName.List.remove(self)
        BaseClass.allsprites.remove(self)
        del self


class Effects(BaseClass):
    List = pygame.sprite.Group()

    def __init__(self,x,y,image_string):
        BaseClass.__init__(self,x,y,image_string)
        Effects.List.add(self)
Process.py

def process(Cursor,movie,music):

    for event in pygame.event.get():

        Stage = True
        Stage2 = False
        keys = pygame.key.get_pressed()

        if Stage:
            if Cursor.rect.collidepoint(370,340): #Start
                if keys[pygame.K_RETURN]:
                    Stage2 = True

        if Stage2:
            Stage = False
            hitkeys = HitKeys(65,600,"Images/Hit Keys.png") #520
            lane = KeyLane(50,0,"Images/4k lane.png")
            movie.play()
            pygame.mixer.music.play()   

            if keys[pygame.K_d]:
                effect1 = Effects(55,0,"Images/Effect.png")
我在编程方面没有经验,所以实现我想要的东西的方法非常迂回。如您所见,我希望Effect.png在按下D键时显示,但仅在Stage2期间显示。这根本不会发生。如果我把它编成一个部分,它就会工作,但这意味着它会出现在舞台上。不是我想要的

如果您能帮我确定为什么它没有出现在Stage2中,我将不胜感激。

在pygame.event.get中的for event中:您设置了

所以每次运行流程时,都会转到Stage=True

你必须把它设置好

    Stage = True
    Stage2 = False
在游戏开始前,while True:

顺便说一句:你必须使用Stage和Stage2

也许最好使用一个阶段并指定阶段编号1、2

顺便说一句:有python规则如何命名函数和变量-对于变量名stage、stage1、all_sprite使用小写和u,并且在类名中使用大写字母。事件堆栈使用该规则,它使用浅蓝色作为类名

编辑:

我制作了测试键盘的脚本。检查你得到了什么

keys=pygame.key.get_pressed工作,但仅当屏幕/窗口存在时

import pygame
import pygame.locals

pygame.init()

screen = pygame.display.set_mode((800,600))

d_pressed = False

running = True

while running:

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

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            elif event.key == pygame.K_d:
                d_pressed = True

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_d:
                d_pressed = False

        keys = pygame.key.get_pressed()

        if d_pressed:
            print '> d_pressed <'

        if keys[pygame.K_RETURN]:
            print '> K_RETURN <'

        if keys[pygame.K_d]:
            print '> K_d <'
-


在某些地方添加打印-例如在if键之前和if键内部,以查看发生了什么。你可以打印效果。在一些地方列出,看看是否有预期的元素。如果你没有使用IDE,我也很幸运地完成了代码的单步执行。因此,我确实将stage和stage2的值放在了True之前:它没有立即解决问题。我把printMenu放在if stage:之后,把printGame放在if stage2:之后。当我运行程序时,shell会打印一堆游戏,没什么大不了的。但当我按enter键进入Stage2时,游戏只打印一次,然后菜单会反复打印。D也没有反应,打印出来,什么也没有出现。谢谢你的提示。我试着使用pygame.key.get_,但它不起作用。但什么都没发生我从来没用过它:。您仍然可以使用event.key获取D。我将后面的示例放在答案中。请参阅我的答案。您可以添加更多打印来测试keys[pygame.K_d]在不同时刻是否正确。为此,我发现问题在于stage和stage2的状态没有正确更改。因为当我试图用False覆盖stage时,它仍然返回True。外壳应该是垃圾游戏后,点击进入权?所以我想现在的主要问题是,当我进入第二阶段时,如何让程序忽略阶段中的所有内容。现在我看到了问题。使用processCursor、movie、music、stage、stage1 python只将变量stage、stage1`中的值发送到process,现在在process中,您有了名称相同的新局部变量stage、stage1。当脚本返回到while True时,就有了具有旧值的变量。您可以使用阶段列表将其发送到流程-请参阅答案中的新示例。
process(Cursor,movie,music, Stage, Stage2)
import pygame
import pygame.locals

pygame.init()

screen = pygame.display.set_mode((800,600))

d_pressed = False

running = True

while running:

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

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            elif event.key == pygame.K_d:
                d_pressed = True

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_d:
                d_pressed = False

        keys = pygame.key.get_pressed()

        if d_pressed:
            print '> d_pressed <'

        if keys[pygame.K_RETURN]:
            print '> K_RETURN <'

        if keys[pygame.K_d]:
            print '> K_d <'
stages = [True, False]

while True:
    process(Cursor, movie, music, stages)

    Effects.List.draw(screen)
    pygame.display.flip()
while True

def process(Cursor,movie,music, stages):

    for event in pygame.event.get():

        keys = pygame.key.get_pressed()

        if stages[0]:
            if Cursor.rect.collidepoint(370,340): #Start
                if keys[pygame.K_RETURN]:
                    stages[0] = False
                    stages[1] = True

        if stage[1]:
            hitkeys = HitKeys(65,600,"Images/Hit Keys.png") #520
            lane = KeyLane(50,0,"Images/4k lane.png")
            movie.play()
            pygame.mixer.music.play()   

            if keys[pygame.K_d]:
                effect1 = Effects(55,0,"Images/Effect.png")