【问题标题】:Not sure why key press is not doing anything不知道为什么按键没有做任何事情
【发布时间】:2014-07-15 14:41:00
【问题描述】:

我在按程序中的 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)

进程.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 期间出现。它只是不会发生。如果我将它的一部分削去它会起作用,但这意味着它会出现在Stage 期间。不是我想要的。

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

【问题讨论】:

  • 在某些地方添加print - 例如在if key 之前和if key 内部以查看发生了什么。您可以在几个地方打印 Effects.List 以查看是否有预期的元素。
  • 如果您不使用 IDE,我也很幸运能够使用 PDB module 逐步执行代码。

标签: python pygame


【解决方案1】:

for event in pygame.event.get():你设置

    Stage = True
    Stage2 = False

所以每次运行 process() 时,您都会转到 Stage (Stage = True)

你必须设置

    Stage = True
    Stage2 = False

游戏开始时(while True:之前)


顺便说一句:你必须在

中使用StageStage2
process(Cursor,movie,music, Stage, Stage2)

最好使用一个Stage 并分配阶段号12


顺便说一句: 有 python 规则如何命名函数和变量(PEP8) - 使用小写(和_)作为变量名(stagestage1、@987654339 @) 并在类名中使用大写字母。事件Stackover 使用该规则并使用浅蓝色作为类名。


编辑:

我编写了脚本来测试键盘。检查你得到了什么。

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 <'

编辑:将阶段作为列表发送 - 不是(分隔)值

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")

【讨论】:

  • 所以我确实将stagestage2 值放在while True: 之前,但它并没有立即解决问题。我把print("Menu")放在if stage:之后,把print("Game")放在if stage2:之后。当我运行程序时,shell 会打印出一堆Game,没什么大不了的。但是当我按回车键转到Stage2 时,Game 只打印一次,然后重复打印Menupuu.sh/ad5oN.png。 D 仍然没有反应,输入print 并没有任何反应。并感谢您的提示。
  • 我尝试使用pygame.key.get_pressed(),但它不起作用。但是什么也没发生,我从来没有使用过它:)。您仍然可以使用event.key 获取D。我把后面的例子放在答案中。
  • 看我的回答。您可以添加更多print 来测试keys[pygame.K_d] 在不同时刻是否为True
  • 谢谢你,我发现问题是stagestage2的状态没有正确改变。因为当我尝试用False 覆盖它时,stage 仍然返回True。按 Enter 后,shell 应该发送垃圾邮件 Game 对吗?所以我想现在的主要问题是当我转到stage2 时,如何让程序忽略stage 中的所有内容。
  • 现在我看到了问题。使用process(Cursor,movie,music, stage, stage1) python send only values from variables stage, stage1` 到process - 现在在proccess 你有新的局部变量同名stage, stage1。当脚本返回while True 时,您的变量具有旧值。您可以使用阶段列表将其发送到process - 请参阅答案中的新示例。
猜你喜欢
  • 2021-08-11
  • 2021-12-20
  • 2011-07-25
  • 2015-06-30
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多