python - 关键事件停止关闭屏幕?
问题描述
我开始在我的游戏上对键盘按键进行编程,其想法是,对于按下的每个按钮,玩家都会发出声音,好的,一切正常,但由于某种原因,在我对按键进行编程后,游戏屏幕停止关闭,如果我按 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
主要()。更新()
解决方案
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()
推荐阅读
- haproxy - 如何在Haproxy中根据url参数形成一个stick table
- angular - 根据Angular中父组件到子组件的选项传递动态Html元素?
- r - 在ggplot中为具有相同数量的箱绘制平均x和平均y?
- flutter - 如何在 DropdownButton 中更改 Flutter DropdownMenuItem 的宽度/填充?
- c# - 使用 Selenium Webdriver C# 和 Chrome 浏览器弹出窗口中的“允许多次下载”
- python - 从熊猫列中删除重复的字母只存在于彼此,Python
- python - 有没有比这种循环逻辑更好的方法?
- rdkit - 如何使用 rdkit 将微笑转换为指纹?
- java - Java 中毕达哥拉斯树的可视化表示
- localization - TYPO3:如何在TYPO3 9中将新闻的sys_language_uid设置为-1?