Pygame如何仅在特定函数运行时降帧实现打字效果且不影响其他动画
实现方案
核心逻辑是给TextPrint类增加独立的时间控制逻辑,不依赖全局帧率控制打字速度,全局帧率保持原有值即可,不会影响其他动画效果。
修改步骤
- 在初始化方法中新增两个属性:
type_interval:每输出一个字符的间隔时间,单位为毫秒,可根据需求自定义last_update_tick:记录上一次更新字符索引的时间戳
- 重写
update方法,只有当前时间与上一次更新时间的差值超过设定的间隔时,才更新字符索引,避免每帧都新增字符。
修改后完整代码
import pygame # 模拟逐字符在屏幕上输出文本 class TextPrint: def __init__(self, xpos, ypos, fontSize, fontColor, string, gameSurface, type_interval=100): self.xpos = xpos self.ypos = ypos self.font = pygame.font.SysFont('Lucida Console', fontSize) self.fontColor = fontColor self.displayText = string self.active = False # 文本区域是否正在输出内容 self.activeIndex = 0 # 当前渲染到的字符索引 self.gameSurface = gameSurface # 新增独立时间控制属性 self.type_interval = type_interval # 每个字符输出间隔,默认100ms self.last_update_tick = 0 # 上一次更新字符的时间戳 def update(self): # 未激活或者已经输出完成直接返回 if not self.active or self.activeIndex >= len(self.displayText): return current_tick = pygame.time.get_ticks() # 只有时间差超过设定间隔才更新字符 if current_tick - self.last_update_tick >= self.type_interval: self.activeIndex += 1 self.last_update_tick = current_tick # 索引更新时再渲染文本,避免重复渲染浪费性能 self.surf = self.font.render(self.displayText[:self.activeIndex], True, self.fontColor) self.rect = self.surf.get_rect(x=self.xpos,y=self.ypos) # 输出完成后自动标记为非激活 if self.activeIndex >= len(self.displayText): self.active = False def draw(self): # 至少渲染了一个字符时再执行绘制 if self.activeIndex > 0: self.gameSurface.blit(self.surf, self.rect)
补充说明
- 若需要调整打字速度,直接修改实例的
type_interval属性即可,值越小打字速度越快 - 若需要实现按按键跳过打字效果,直接将
activeIndex设置为len(self.displayText),并标记active=False即可 - 原有全局帧率、其他动画的更新逻辑完全不需要修改,不会受到任何影响
内容的提问来源于stack exchange,提问作者madmonkey
相关产品推荐
相关产品推荐

