Hello, everyone. I’m experimenting with Panda3D, and right now I’m trying to replicate the letter-by-letter appearance of text that is so popular in video games such as the Final Fantasy series, Harvest Moon series, Zelda, and many others. I’ve put together a short snippet that does this via a task below:
from direct.showbase.ShowBase import ShowBase from panda3d.core import TextNode from direct.task import Task class GuiTest(ShowBase): accessTest = 0 textLength = 0 def __init__(self): global accessTest global textLength ShowBase.__init__(self) base.disableMouse() base.setFrameRateMeter(True) textPrint = "The quick brown fox jumped over the lazy dogs." accessTest = 0 textLength = len (textPrint) self.taskMgr.add(self.printText, "testing Task", extraArgs=[textPrint], appendTask=True) def printText(self, text, task): global accessTest global textLength if accessTest == 0: self.text = TextNode('TestScroll') textNodePath = aspect2d.attachNewNode(self.text) textNodePath.setScale(0.07) textNodePath.setX(-.9) textNodePath.setZ(-.8) if accessTest < textLength: self.text.setText(text[:accessTest]) accessTest += 1 return Task.cont else: return Task.done app = GuiTest() app.run()
Please excuse the extreme crudity of this example. It does work, but the performance is very poor (note the framerate while the example program runs!)—though there is no intentional delay coding and even though I have a fairly capable system, the text rendering is occurring much slower than even 30 frames per second.
I noted in the manual that Panda3D does have performance issues with text updating but this is an extremely common effect—I cannot think of many adventure/RPG/action games that do not use the scroll text effect. Am I missing something (very likely!), or is there a better, more performant way of doing this (even more likely!)?