1

I start to program the keyboard keys on my game, the idea is that for each button that is pressed the player will make a sound, ok everything work fine, but for some reason after I program the keys the game screen stop to close, if I press the X the screen not close , sometimes it close but after I press the X several times enter image description hereThe inssue

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

Main Code

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

Juw
  • 43
  • 6
  • 1
    What happened to the `pygame.QUIT`event? Do you have multiple event loops? See [Faster version of 'pygame.event.get()'. Why are events being missed and why are the events delayed?](https://stackoverflow.com/questions/58086113/faster-version-of-pygame-event-get-why-are-events-being-missed-and-why-are/58087070#58087070) – Rabbid76 Apr 10 '21 at 15:32
  • Your case may be different, however the problem is the same. You have multiple event loops and you call `pygame.event.get()` multiple times. This causes some events to be lost. It is hardly possible to help without seeing the code from the "main" archive. – Rabbid76 Apr 10 '21 at 17:10
  • 1
    OK now i add the code – Juw Apr 10 '21 at 17:25

1 Answers1

0

pygame.event.get() get all the messages and remove them from the queue. See the documentation:

This will get all the messages and remove them from the queue. [...]

If pygame.event.get() is called in multiple event loops, only one loop receives the events, but never all loops receive all events. As a result, some events appear to be missed.
Get the events once per frame and use them in multiple loops or pass the list or events to functions and methods where they are handled.

Main module:

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

Draw module

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

def draw(self, event_list):
    self.all_sprites.update()
    self.move()
    self.chek()
Rabbid76
  • 202,892
  • 27
  • 131
  • 174