pygame问题
本帖最后由 flyps 于 2024-7-29 14:14 编辑我在制作游戏时调用了下文的say函数,程序却卡住了,这是怎么回事import pygame
from pygame.locals import *
pygame.init()
Acolour = (255, 255, 255)
def changeC(colour, acolour = Acolour):
acolour = colour
def say(story, surface, size, afont, k, colour = Acolour):
Astory = list(story)
Bstory = ""
for i in Astory:
Bstory = "".join()
pygame.draw.rect(surface, colour, (size/2, size/2, size, size/4), 10)
surface.blit(afont.render(Bstory, True, colour), (size/2, size/2))
while not k:
surface.blit(afont.render(Bstory, True, colour), (size/2, size/2))
pygame.time.delay(10)
本帖最后由 smallwh 于 2024-7-29 15:36 编辑
可能因为 say 函数在一个模块里,pygame 把它里面的循环当作了主循环。
证据:当我在 say 函数的循环里加入事件监听时就不再卡住。在调用 say 函数的主程序的主循环中插入 print,只执行一次。
或许你应该删掉 say 函数的循环,在主循环中不断执行 say 函数
def say(story, surface, size, afont, k, colour = Acolour):
if k: #必要时自己修改条件判断
Astory = list(story)
Bstory = ""
for i in Astory:
Bstory = "".join()
pygame.draw.rect(surface, colour, (size/2, size/2, size, size/4), 10)
surface.blit(afont.render(Bstory, True, colour), (size/2, size/2)) 看起来你在实现一个显示文本的函数 `say` 时,程序在循环中卡住了。让我们逐步分析一下你的代码。
首先,问题出在你的 `while not k:` 循环。不论 `k` 是什么值,这个循环通常会一直运行,因为你没有在循环内更新 `k` 的值。简单来说,如果 `k` 一开始是 `False`,程序就会一直在这里卡住,不会有机会退出这个循环。
此外,`Bstory = "".join()` 这一行也有些问题。它应该是将你遍历的字符连接成字符串,但当前使用的方式并没有指定要连接的内容,导致 `Bstory` 依然为空字符串,你显示的文本实际上也是空的。
为了让这段代码工作,你可以做如下调整:
1. 确保在 `while` 循环内部,能够适时地更新 `k` 的值。比如,可以添加事件处理,监听用户输入。
2. 更新 `Bstory` 的赋值逻辑,使其能正确拼接字符。
3. 在绘制之前,你可能希望在每次循环中清除先前的内容,以免看到重叠的文本。
这是修改过的代码示例:
import pygame
from pygame.locals import *
pygame.init()
Acolour = (255, 255, 255)
def changeC(colour, acolour=Acolour):
acolour = colour
def say(story, surface, size, afont, k, colour=Acolour):
Astory = list(story)
Bstory = ""
# 这个循环用于逐个显示字符
for i in Astory:
Bstory += i# 将字符添加到Bstory
# 绘制矩形和文本
pygame.draw.rect(surface, colour, (size/2, size/2, size, size/4), 10)
surface.blit(afont.render(Bstory, True, colour), (size/2, size/2))
pygame.display.flip()# 更新屏幕
pygame.time.delay(100)# 延迟,以便可以看到字符逐个出现
# 之后的循环用于保持显示直到k为True
while not k:
for event in pygame.event.get():
if event.type == QUIT:
k = True# 如果退出事件发生,设置k为True
surface.fill((0, 0, 0))# 清除屏幕
pygame.draw.rect(surface, colour, (size/2, size/2, size, size/4), 10)
surface.blit(afont.render(Bstory, True, colour), (size/2, size/2))
pygame.display.flip()
pygame.time.delay(100)
# 记得在调用say函数之前进行初始化、创建窗口以及字体等
通过以上修改,你的程序现在应该能逐个展示字符,然后保持显示直到用户进行某种操作来结束它。记得适当处理游戏的退出逻辑哦!祝你编程愉快,别忘了给代码加点幽默感,比如在显示文本时加个“故事加载中,请稍候……”之类的!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-7-29 14:14
看起来你在实现一个显示文本的函数 `say` 时,程序在循环中卡住了。让我们逐步分析一下你的代码。
首先 ...
可是k其实是pygame的key.get_pressed()对象
smallwh 发表于 2024-7-29 14:13
可能因为 say 函数在一个模块里,pygame 把它里面的循环当作了主循环。
证据:当我在 say 函数的循环里加 ...
错误,实际因为他pygame.time.delay了 歌者文明清理员 发表于 2024-7-29 19:29
错误,实际因为他pygame.time.delay了
仅删掉 pygame.time.delay 不能解决问题。
测试代码:
import pygame
import sys
from pygame.locals import *
pygame.init()
Acolour = (255, 255, 255)
def changeC(colour, acolour = Acolour):
acolour = colour
def say(story, surface, size, afont, k, colour = Acolour):
Astory = list(story)
Bstory = ""
for i in Astory:
Bstory = "".join()
pygame.draw.rect(surface, colour, (size/2, size/2, size, size/4), 10)
surface.blit(afont.render(Bstory, True, colour), (size/2, size/2))
while not k:
surface.blit(afont.render(Bstory, True, colour), (size/2, size/2))
print(20) #测试 pygame.time.delay
screen = pygame.display.set_mode((400,300))
font = pygame.font.SysFont("simsun", 20)
k = pygame.key.get_pressed()
while True:
print(10)
say('asdfghj',screen,(100,200),font,k)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
k = pygame.key.get_pressed()
只输出一次 10 ,然后 pygame 未响应
print(20) 也没有执行,说明 while not k 成为了主循环,pygame.time.delay 压根没有执行 smallwh 发表于 2024-7-29 22:45
仅删掉 pygame.time.delay 不能解决问题。
测试代码:
哦,我看错了
页:
[1]