鱼C论坛

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

[已解决]pygame问题

[复制链接]
发表于 2024-7-29 14:13:45 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 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([Bstory, i])
        pygame.draw.rect(surface, colour, (size[0]/2, size[1]/2, size[0], size[1]/4), 10)
        surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))
    while not k[K_z]:
        surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))
    pygame.time.delay(10)
最佳答案
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[K_z]: #必要时自己修改条件判断
        Astory = list(story)
        Bstory = ""
        for i in Astory:
            Bstory = "".join([Bstory, i])
            pygame.draw.rect(surface, colour, (size[0]/2, size[1]/2, size[0], size[1]/4), 10)
            surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))

最佳答案

查看完整内容

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

使用道具 举报

发表于 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[K_z]: #必要时自己修改条件判断
        Astory = list(story)
        Bstory = ""
        for i in Astory:
            Bstory = "".join([Bstory, i])
            pygame.draw.rect(surface, colour, (size[0]/2, size[1]/2, size[0], size[1]/4), 10)
            surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))
想知道小甲鱼最近在做啥?请访问 -> 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. 在绘制之前,你可能希望在每次循环中清除先前的内容,以免看到重叠的文本。

这是修改过的代码示例:
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

首先 ...

可是k其实是pygame的key.get_pressed()对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

错误,实际因为他pygame.time.delay了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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([Bstory, i])
        pygame.draw.rect(surface, colour, (size[0]/2, size[1]/2, size[0], size[1]/4), 10)
        surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/2))
    while not k[K_z]:
        surface.blit(afont.render(Bstory, True, colour), (size[0]/2, size[1]/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[K_z] 成为了主循环,pygame.time.delay 压根没有执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

哦,我看错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 23:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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