首页 > 解决方案 > 关键事件停止关闭屏幕?

问题描述

我开始在我的游戏上对键盘按键进行编程,其想法是,对于按下的每个按钮,玩家都会发出声音,好的,一切正常,但由于某种原因,在我对按键进行编程后,游戏屏幕停止关闭,如果我按 X 屏幕没有关闭,有时它会关闭,但在我按 X 几次 在此处输入图像描述

  import pygame

from Obj import Obj

from Spritesheet import Spritesheet


class Draw:
def __init__(self):
    pygame.mixer.init()
    self.up_sound = pygame.mixer.Sound('/home/julio/PycharmProjects/Test/Assets/Sounds/a.ogg')
    self.down_sound = pygame.mixer.Sound('/home/julio/PycharmProjects/Test/Assets/Sounds/o.ogg')
    self.right_sound = pygame.mixer.Sound('/home/julio/PycharmProjects/Test/Assets/Sounds/i -.ogg')
    self.left_sound = pygame.mixer.Sound('/home/julio/PycharmProjects/Test/Assets/Sounds/u.ogg')

    self.all_sprites = pygame.sprite.Group()
    self.my_sprite = Spritesheet('/home/julio/PycharmProjects/Test/Assets/sprites1.png')

    self.up = False
    self.down = False
    self.left = False
    self.right = False
    self.idle = False
    self.go = True

    self.bg = Obj('/home/julio/PycharmProjects/Test/Assets/bg.png', 0, 0, self.all_sprites)
    self.sprite1_1 = self.my_sprite.get_sprite(0, 54, 405, 400)
    self.sprite1 = pygame.transform.scale(self.sprite1_1, (355, 358))
    self.sprite2_2 = self.my_sprite.get_sprite(0, 2134, 405, 408)  # 405, 408
    self.sprite2 = pygame.transform.scale(self.sprite2_2, (355, 358))
    self.sprite3_3 = self.my_sprite.get_sprite(4065, 2118, 405, 408)
    self.sprite3 = pygame.transform.scale(self.sprite3_3, (355, 358))
    self.sprite4_4 = self.my_sprite.get_sprite(0, 3159, 405, 408)
    self.sprite4 = pygame.transform.scale(self.sprite4_4, (355, 358))
    self.sprite5_5 = self.my_sprite.get_sprite(9, 2654, 405, 408)
    self.sprite5 = pygame.transform.scale(self.sprite5_5, (355, 358))
    self.x = 100
    self.y = 100

    self.tick = 0

def ticks(self):
    self.tick += 1
    if self.tick == 60:
        self.tick = 0
        self.go = True

def prit(self, janela):
    self.all_sprites.draw(janela)

def move(self):

    for evento in pygame.event.get():
        if evento.type == pygame.KEYDOWN:
            if evento.key == pygame.K_UP:
                self.up = True
                self.down = False
                self.left = False
                self.right = False
                self.up_sound.play()

            if evento.key == pygame.K_DOWN:
                self.down = True
                self.left = False
                self.right = False
                self.up = False
                self.down_sound.play()

            if evento.key == pygame.K_LEFT:
                self.up = False
                self.down = False
                self.left = True
                self.right = False
                self.left_sound.play()

            if evento.key == pygame.K_RIGHT:
                self.up = False
                self.down = False
                self.left = False
                self.right = True
                self.right_sound.play()

        if evento.type == pygame.KEYUP:
            if evento.key == pygame.K_DOWN:
                self.down = False

            if evento.key == pygame.K_UP:
                self.up = False

            if evento.key == pygame.K_LEFT:
                self.left = False

            if evento.key == pygame.K_RIGHT:
                self.right = False

def chek(self):
    if not self.up and not self.down and not self.left and not self.right:
        self.idle = True
    else:
        self.idle = False

def draw(self):
    self.all_sprites.update()
    self.move()
    self.chek()

主要代码

import pygame
from Draw import Draw


class Main:
def __init__(self):
    pygame.init()

    self.janela = pygame.display.set_mode([600, 600])
    pygame.display.set_caption('Test')

    self.loop = True
    self.Draw = Draw()
    self.fps = pygame.time.Clock()

def event(self):
    for event in self.Draw.event_list:
        if event.type == pygame.QUIT:
            print('Quit')
            self.loop = False

def draw(self):
    self.Draw.prit(self.janela)
    self.Draw.draw()

    if self.Draw.down:
        self.janela.blit(self.Draw.sprite3, (self.Draw.x, self.Draw.y))

    if self.Draw.right:
        self.janela.blit(self.Draw.sprite4, (self.Draw.x, self.Draw.y))

    if self.Draw.left:
        self.janela.blit(self.Draw.sprite5, (self.Draw.x, self.Draw.y))

    if self.Draw.up:
        self.janela.blit(self.Draw.sprite2, (self.Draw.x, self.Draw.y))

    if self.Draw.idle:
        self.janela.blit(self.Draw.sprite1, (self.Draw.x, self.Draw.y))

def update(self):
    while self.loop:
        self.event()
        self.draw()
        self.fps.tick(60)
        # print(self.fps)
        pygame.display.update()

    pass

主要()。更新()

标签: pythonpython-3.xpygame

解决方案


pygame.event.get()获取所有消息并将它们从队列中删除。请参阅文档:

这将获取所有消息并将它们从队列中删除。[...]

如果pygame.event.get()在多个事件循环中调用,则只有一个循环接收事件,但绝不会所有循环都接收所有事件。结果,似乎错过了一些事件。
每帧获取一次事件并在多个循环中使用它们,或者将列表或事件传递给处理它们的函数和方法。

主要模块:

def event(self, event_list):
    for event in event_list:
        if event.type == pygame.QUIT:
            print('Quit')
            self.loop = False

def draw(self, event_list):
    self.Draw.prit(self.janela)
    self.Draw.draw(event_list)

    # [...]

def update(self):
    while self.loop:
  
        event_list = pygame.event.get()
 
        self.event(event_list)
        self.draw(event_list)
        self.fps.tick(60)
        # print(self.fps)
        pygame.display.update()

绘图模块

def move(self, event_list):
    for evento in event_list:
        # [...]

def draw(self, event_list):
    self.all_sprites.update()
    self.move()
    self.chek()

推荐阅读