【问题标题】:Key events stop to close the screen? [duplicate]关键事件停止关闭屏幕? [复制]
【发布时间】:2021-04-10 15:15:58
【问题描述】:

我开始在我的游戏中对键盘按键进行编程,其想法是,对于每个按下的按钮,玩家都会发出声音,一切正常,但由于某种原因,在我对按键进行编程后,游戏屏幕会停止关闭,如果我按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

Main().update()

【问题讨论】:

标签: python python-3.x pygame


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多