gpt4 book ai didi

Python游戏总是崩溃或卡住| pygame

转载 作者:行者123 更新时间:2023-12-01 00:05:27 25 4
gpt4 key购买 nike

我正在使用 pygame 模块制作一个不错的游戏,基本上我想做两件事:

  1. 无限循环地运行游戏,看看用户是否想关闭游戏,如果他想关闭游戏,就给他弹出一个MessageBox。

  2. 在第二个函数中,我想添加游戏的所有功能并在屏幕上绘图。

我的问题是,当我尝试使用 Thread 运行它们时,游戏会卡住并且没有响应。

这是我的电脑的问题吗?意味着它太弱而无法运行游戏?
还是我的代码有问题导致游戏无法正常运行?

代码:

import pygame
import ctypes
from threading import Thread

class Game:
def __init__(self):
self.init = pygame.init()
self.screen = pygame.display.set_mode((800, 500))
self.allProcess()

def runGame(self):
self.running = True
while self.running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
ctypes.windll.user32.MessageBoxW(0, 'Thank you for Playing!', 'Thank You', 0)
self.running = False

def items(self):
self.screen.fill((255, 255, 255))
pygame.draw.circle(self.screen, (0, 0, 255), (250, 250), 75)

def allProcess(self):
Thread(target=self.runGame).start()
Thread(target=self.items).start()


if __name__ == '__main__':
ins = Game()

最佳答案

Pygame 是基于 SDL2 构建的,它有一些关于在哪些线程中可以调用某些函数的规则。例如,对于事件模块中的函数,( "you can only call this function in the thread that set the video mode." )。

除非绝对必要,否则您几乎应该始终避免使用线程!它们使您的程序具有不确定性,更难调试、更难测试、更难维护,而且通常速度较慢(除非您有效地使用它们)。在您的程序中,没有理由使用线程。就您而言,它们是不必要的。你应该这样做:

import pygame
import ctypes

class Game:
def __init__(self):
self.init = pygame.init()
self.screen = pygame.display.set_mode((800, 500))
self.runGame()

def runGame(self):
self.running = True
while self.running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
ctypes.windll.user32.MessageBoxW(0, 'Thank you for Playing!', 'Thank You', 0)
self.running = False

self.screen.fill((255, 255, 255))
pygame.draw.circle(self.screen, (0, 0, 255), (250, 250), 75)

pygame.display.flip() # Don't forget to call this to update the screen!



if __name__ == '__main__':
ins = Game()

代码更少,具有确定性,并且很可能更快并且使用更少的内存。

关于Python游戏总是崩溃或卡住| pygame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60016180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com