你如何在visual basic 2010中编写打字机效果?

时间:2012-05-16 14:44:34

标签: visual-studio-2010

我正在创建一个视频游戏,我需要一次显示一个字符,而互联网的其他部分对我们一无所知的旧版Visual Basic基本没什么帮助。< / p>

这是我错误的代码:

Dim outfile As IO.StreamWriter
Dim infile As IO.StreamReader

Private Sub StartScreen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim strTitle As String = " "
    Dim strText() As String = {}
    Dim intLoop As Integer = 0

    If IO.File.Exists("save.txt") = False Then
        outfile = IO.File.CreateText("save.txt")
    End If

    infile = IO.File.OpenText("save.txt")
    Do Until infile.Peek = -1
        strText(intLoop) = infile.Read
        System.Threading.Thread.Sleep(1000)
        intLoop += 1
    Loop
    intLoop = 0
    Do While strText.Length <> intLoop
        strTitle = strText(intLoop)
        lblTitle.Text = lblTitle.Text & strTitle
        intLoop += 1
    Loop
    infile.Close()
    outfile.Close()
End Sub

1 个答案:

答案 0 :(得分:0)

首先 - 除了您的主要问题之外 - 您的Thread.Sleep似乎位于错误的位置。当你将文件读入内存时,你正在睡觉,但是当你将文本复制到你的'lblTitle'时却没有 - 所以你花了很长时间阅读文件,然后立即将整个文件复制到UI中。这不是你想要的效果:读取整个文件,并将延迟放在第二个循环中。

您的表单未显示的原因是您的所有代码都在表单的_Load方法中 - 并且表单在完成之前不会显示。因此,相反,您的表单会在文本中保持隐藏的秒数。它应该最终出现,但这不是你所追求的效果,我敢肯定!

处理此问题的最直接方法是将所有代码推送到单独的方法中,并在后台线程上调用该方法。这将允许您的表单加载和显示,后台线程将继续处理您的文本。但是,您需要稍微修改代码,因为您无法从后台线程修改UI。查看Invoke和/或BeginInvoke方法,了解如何解决此问题。

另一个解决方案是取出Thread.Sleep(1000),将代码移到单独的方法,然后在Timer上调用该方法。计时器可以每秒触发一次并每次添加文本的下一个字符。这可能会产生更清晰的代码,但您可能希望确保直接读取和关闭文件,而不是(正如您现在所做的那样)保持文件锁定,直到整个过程完成。