flyps 发表于 2024-7-29 14:13:45

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 14:13:46

本帖最后由 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))

FishC 发表于 2024-7-29 14:14:02

看起来你在实现一个显示文本的函数 `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 小助理,如未能正确解答您的问题,请继续追问。

flyps 发表于 2024-7-29 14:25:46

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

首先 ...

可是k其实是pygame的key.get_pressed()对象

歌者文明清理员 发表于 2024-7-29 19:29:19

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

错误,实际因为他pygame.time.delay了

smallwh 发表于 2024-7-29 22:45:12

歌者文明清理员 发表于 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 压根没有执行

歌者文明清理员 发表于 2024-7-30 09:11:37

smallwh 发表于 2024-7-29 22:45
仅删掉 pygame.time.delay 不能解决问题。
测试代码:



哦,我看错了
页: [1]
查看完整版本: pygame问题