鱼C论坛

 找回密码
 立即注册
查看: 516|回复: 6

[已解决]pygame问题

[复制链接]
发表于 2024-7-29 14:13:45 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 flyps 于 2024-7-29 14:14 编辑

我在制作游戏时调用了下文的say函数,程序却卡住了,这是怎么回事
  1. import pygame
  2. from pygame.locals import *
  3. pygame.init()
  4. Acolour = (255, 255, 255)
  5. def changeC(colour, acolour = Acolour):
  6.     acolour = colour
  7. def say(story, surface, size, afont, k, colour = Acolour):
  8.     Astory = list(story)
  9.     Bstory = ""
  10.     for i in Astory:
  11.         Bstory = "".join([Bstory, i])
  12.         pygame.draw.rect(surface, colour, (size[0]/2, size[1]/2, size[0], size[1]/4), 10)
  13.         surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))
  14.     while not k[K_z]:
  15.         surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))
  16.     pygame.time.delay(10)
复制代码
最佳答案
2024-7-29 14:13:46
本帖最后由 smallwh 于 2024-7-29 15:36 编辑

可能因为 say 函数在一个模块里,pygame 把它里面的循环当作了主循环。
证据:当我在 say 函数的循环里加入事件监听时就不再卡住。在调用 say 函数的主程序的主循环中插入 print,只执行一次。
或许你应该删掉 say 函数的循环,在主循环中不断执行 say 函数
  1. def say(story, surface, size, afont, k, colour = Acolour):
  2.     if k[K_z]: #必要时自己修改条件判断
  3.         Astory = list(story)
  4.         Bstory = ""
  5.         for i in Astory:
  6.             Bstory = "".join([Bstory, i])
  7.             pygame.draw.rect(surface, colour, (size[0]/2, size[1]/2, size[0], size[1]/4), 10)
  8.             surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))
复制代码

最佳答案

查看完整内容

可能因为 say 函数在一个模块里,pygame 把它里面的循环当作了主循环。 证据:当我在 say 函数的循环里加入事件监听时就不再卡住。在调用 say 函数的主程序的主循环中插入 print,只执行一次。 或许你应该删掉 say 函数的循环,在主循环中不断执行 say 函数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-29 14:13:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 smallwh 于 2024-7-29 15:36 编辑

可能因为 say 函数在一个模块里,pygame 把它里面的循环当作了主循环。
证据:当我在 say 函数的循环里加入事件监听时就不再卡住。在调用 say 函数的主程序的主循环中插入 print,只执行一次。
或许你应该删掉 say 函数的循环,在主循环中不断执行 say 函数
  1. def say(story, surface, size, afont, k, colour = Acolour):
  2.     if k[K_z]: #必要时自己修改条件判断
  3.         Astory = list(story)
  4.         Bstory = ""
  5.         for i in Astory:
  6.             Bstory = "".join([Bstory, i])
  7.             pygame.draw.rect(surface, colour, (size[0]/2, size[1]/2, size[0], size[1]/4), 10)
  8.             surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-29 14:14:02 | 显示全部楼层
看起来你在实现一个显示文本的函数 `say` 时,程序在循环中卡住了。让我们逐步分析一下你的代码。

首先,问题出在你的 `while not k:` 循环。不论 `k` 是什么值,这个循环通常会一直运行,因为你没有在循环内更新 `k` 的值。简单来说,如果 `k` 一开始是 `False`,程序就会一直在这里卡住,不会有机会退出这个循环。

此外,`Bstory = "".join()` 这一行也有些问题。它应该是将你遍历的字符连接成字符串,但当前使用的方式并没有指定要连接的内容,导致 `Bstory` 依然为空字符串,你显示的文本实际上也是空的。

为了让这段代码工作,你可以做如下调整:

1. 确保在 `while` 循环内部,能够适时地更新 `k` 的值。比如,可以添加事件处理,监听用户输入。
2. 更新 `Bstory` 的赋值逻辑,使其能正确拼接字符。
3. 在绘制之前,你可能希望在每次循环中清除先前的内容,以免看到重叠的文本。

这是修改过的代码示例:

  1. import pygame
  2. from pygame.locals import *
  3. pygame.init()

  4. Acolour = (255, 255, 255)

  5. def changeC(colour, acolour=Acolour):
  6.     acolour = colour

  7. def say(story, surface, size, afont, k, colour=Acolour):
  8.     Astory = list(story)
  9.     Bstory = ""
  10.    
  11.     # 这个循环用于逐个显示字符
  12.     for i in Astory:
  13.         Bstory += i  # 将字符添加到Bstory
  14.         
  15.         # 绘制矩形和文本
  16.         pygame.draw.rect(surface, colour, (size/2, size/2, size, size/4), 10)
  17.         surface.blit(afont.render(Bstory, True, colour), (size/2, size/2))
  18.         
  19.         pygame.display.flip()  # 更新屏幕
  20.         
  21.         pygame.time.delay(100)  # 延迟,以便可以看到字符逐个出现

  22.     # 之后的循环用于保持显示直到k为True
  23.     while not k:
  24.         for event in pygame.event.get():
  25.             if event.type == QUIT:
  26.                 k = True  # 如果退出事件发生,设置k为True
  27.         surface.fill((0, 0, 0))  # 清除屏幕
  28.         pygame.draw.rect(surface, colour, (size/2, size/2, size, size/4), 10)
  29.         surface.blit(afont.render(Bstory, True, colour), (size/2, size/2))
  30.         pygame.display.flip()
  31.         pygame.time.delay(100)

  32. # 记得在调用say函数之前进行初始化、创建窗口以及字体等
复制代码


通过以上修改,你的程序现在应该能逐个展示字符,然后保持显示直到用户进行某种操作来结束它。记得适当处理游戏的退出逻辑哦!祝你编程愉快,别忘了给代码加点幽默感,比如在显示文本时加个“故事加载中,请稍候……”之类的!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-29 14:25:46 | 显示全部楼层
FishC 发表于 2024-7-29 14:14
看起来你在实现一个显示文本的函数 `say` 时,程序在循环中卡住了。让我们逐步分析一下你的代码。

首先 ...

可是k其实是pygame的key.get_pressed()对象
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-29 19:29:19 | 显示全部楼层
smallwh 发表于 2024-7-29 14:13
可能因为 say 函数在一个模块里,pygame 把它里面的循环当作了主循环。
证据:当我在 say 函数的循环里加 ...

错误,实际因为他pygame.time.delay了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-29 22:45:12 | 显示全部楼层
歌者文明清理员 发表于 2024-7-29 19:29
错误,实际因为他pygame.time.delay了

仅删掉 pygame.time.delay 不能解决问题。
测试代码:
  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. pygame.init()
  5. Acolour = (255, 255, 255)

  6. def changeC(colour, acolour = Acolour):
  7.     acolour = colour

  8. def say(story, surface, size, afont, k, colour = Acolour):
  9.     Astory = list(story)
  10.     Bstory = ""
  11.     for i in Astory:
  12.         Bstory = "".join([Bstory, i])
  13.         pygame.draw.rect(surface, colour, (size[0]/2, size[1]/2, size[0], size[1]/4), 10)
  14.         surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))
  15.     while not k[K_z]:
  16.         surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))
  17.     print(20) #测试 pygame.time.delay


  18. screen = pygame.display.set_mode((400,300))
  19. font = pygame.font.SysFont("simsun", 20)
  20. k = pygame.key.get_pressed()

  21. while True:
  22.     print(10)
  23.     say('asdfghj',screen,(100,200),font,k)
  24.     for event in pygame.event.get():
  25.         if event.type == pygame.QUIT:
  26.             pygame.quit()
  27.             sys.exit()
  28.         elif event.type == pygame.KEYDOWN:
  29.             k = pygame.key.get_pressed()
复制代码

只输出一次 10 ,然后 pygame 未响应
print(20) 也没有执行,说明 while not k[K_z] 成为了主循环,pygame.time.delay 压根没有执行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-30 09:11:37 | 显示全部楼层
smallwh 发表于 2024-7-29 22:45
仅删掉 pygame.time.delay 不能解决问题。
测试代码:

哦,我看错了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 15:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表