以下是我目前为A-Level课程作品制作的游戏片段。我正在制作一个简介过场动画,我希望一次一个字母显示文字(滚动,口袋妖怪风格)。但是,我目前的解决方案需要在每行文本中使用for循环。这对于视觉效果很好,但是它阻止用户能够与窗口交互。我想添加一个跳过按钮,但不能这样做起诉这个问题。我尝试使用更多if语句,但代码变得混乱,错误,并且效率低得多。是否有更简单,更有效的解决方案?
screen.blit(introImage4,(0,16))
if flags["IntroStage3"] == True:
for i in range(len(introText[0])):
introTextImage1 = myFont.render(introText[0][i], True, white)
screen.blit(introTextImage1,(50 + (myFont.size(introText[0][:i])[0]), 50))
pygame.display.update()
clock.tick(textFPS)
for i in range(len(introText[1])):
introTextImage2 = myFont.render(introText[1][i], True, white)
screen.blit(introTextImage2,(50 + (myFont.size(introText[1][:i])[0]), 100))
pygame.display.update()
clock.tick(textFPS)
for i in range(len(introText[2])):
introTextImage3 = myFont.render(introText[2][i], True, white)
screen.blit(introTextImage3,(50 + (myFont.size(introText[2][:i])[0]), 150))
pygame.display.update()
clock.tick(textFPS)
flags["IntroStage4"] = True
flags["IntroStage3"] = False
if flags["IntroStage4"] == True:
introTextImage1 = myFont.render(introText[0], True, white)
introTextImage2 = myFont.render(introText[1], True, white)
introTextImage3 = myFont.render(introText[2], True, white)
screen.blit(introTextImage1,(50, 50))
screen.blit(introTextImage2,(50, 100))
screen.blit(introTextImage3,(50, 150))
flags["IntroStage5"] = True
答案 0 :(得分:0)
这里的问题是事件处理程序无法运行新的检查,直到你的for循环完成。
解决方案是为您的文本编写动画功能。你可以通过添加一个包含屏幕上显示的文本的变量来做到这一点,然后你可以根据一些时间相关的值将这个变量的值更改为你想要滚动的完整文本的另一部分。
此时间相关值可以是自触发滚动文本的事件以来经过的时间。
只是为了让它更清晰一点,这是一个例子:
说我希望完整的文字是"爱丽丝有一大篮水果"但我只能在滚动文本框中输入一个单词,我想要显示它两秒钟:
text = "Alice has a big basket of fruit"
def animate_text(text,t): #here t is current unix time minus the unix time whenthat the event that triggered the text scrolling
text_batches=text.split(' ')
return text_batches[t//2] if t//2 <= len(text_batches) else return False
所以现在我们将文本分成批处理而不是在主循环中嵌套循环,您可以对应于自动画开始以来经过的时间的批处理
while 1!=0:
# game loopy stuff here
blit(animate_text(text,time.time()-time_when_animation_started))
现在这一切都有点混乱和伪造,它并不能很好地处理你的特殊情况,但你应该在这里得到这个想法