【问题标题】:Visual Basic 2010 Express Smooth WASD ControlsVisual Basic 2010 Express 平滑 WASD 控件
【发布时间】:2015-01-17 17:09:27
【问题描述】:

我目前正在使用 Visual Basic 2010 Express 制作迷宫游戏。我目前正在研究迷宫中角色的键盘控件。我成功了……有点。我可以使用以下代码让 Picturebox 对象移动:

Private Sub Lvl1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Select e.KeyCode
            Case Keys.W
                Player.Location = New Point(Player.Location.X, Player.Location.Y - 2)
            Case Keys.S
                Player.Location = New Point(Player.Location.X, Player.Location.Y + 2)
            Case Keys.D
                Player.Location = New Point(Player.Location.X + 2, Player.Location.Y)
            Case Keys.A
                Player.Location = New Point(Player.Location.X - 2, Player.Location.Y)
        End Select
    End Sub

话虽如此,我对结果不是很满意。当我运行该应用程序时,Picturebox 移动 非常 缓慢并且 verrrryyyy 抖动。最重要的是,它不能沿对角线方向移动。我认为这是一款非常不实用的游戏,因为用户可能会对类似蛞蝓的移动速度感到非常厌烦。有什么方法可以简单地对 Picturebox 进行编程,使其以 2 个像素的增量快速移动并且平滑(即在改变方向之前没有延迟)?谢谢!

【问题讨论】:

    标签: visual-studio-2010


    【解决方案1】:

    是的,这不好用。您需要将键盘事件与控件移动分离,以便它们可以以不同的速率发生。声明两个变量来跟踪最后一个用户命令:

    Dim xdir, ydir As Integer
    

    很容易在 KeyDown 事件处理程序中设置它们:

    Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
        Select Case e.KeyCode
            Case Keys.W : ydir = -1
            Case Keys.A : xdir = -1
            Case Keys.S : ydir = 1
            Case Keys.D : xdir = 1
        End Select
    End Sub
    

    在 KeyUp 事件处理程序中有点棘手,用户不一定以可预测的顺序释放它们:

    Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
        Select Case e.KeyCode
            Case Keys.W : If ydir = -1 Then ydir = 0
            Case Keys.A : If xdir = -1 Then xdir = 0
            Case Keys.S : If ydir = 1 Then ydir = 0
            Case Keys.D : If xdir = 1 Then xdir = 0
        End Select
    End Sub
    

    现在您需要一个“游戏循环”,它使用这些命令来实现控件的移动。这可以像定时器一样简单,将 Interval 设置为 15 或 31 毫秒以获得可预测的更新速率。

    Dim velocity As Integer = 4
    
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim newx = PictureBox1.Location.X + velocity * xdir
        newx = Math.Min(Math.Max(0, newx), Me.ClientSize.Width - PictureBox1.Width)
        Dim newy = PictureBox1.Location.Y + velocity * ydir
        newy = Math.Min(Math.Max(0, newy), Me.ClientSize.Height - PictureBox1.Height)
        PictureBox1.Location = New Point(newx, newy)
    End Sub
    

    【讨论】:

    • 实际上,我尝试使用此方法,但编译器给了我一个错误,说“Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量”而我不是很确定这意味着什么……
    • 我可以在这方面寻求帮助^
    【解决方案2】:

    尝试使用 KeyPress 方法而不是 KeyDown,

    如果这不起作用,您将不得不将委托添加到您的代码中。

    查看 MSDN 中的引用 http://msdn.microsoft.com/en-us/library/ms172879.aspx

    【讨论】:

      【解决方案3】:

      针对您关于如何以 2 像素增量快速移动图片框的问题, 我建议您对图片框遵循以下替代策略之一,因为我不知道如何使用图片框以优化的方式制作动画。

      1. 覆盖单个图片框的onpaint或paint函数,绘制整个场景,对从图像文件导入的精灵进行分层。如果你这样做了,矩形对象会在碰撞时派上用场,尤其是它的Rectangle.Intersect() 函数。
      2. 使用 XNA。 XNA 与 Visual Basic 兼容,我设法在 Youtube 上找到了相关的视频教程,该教程展示了如何使用 VB 在 XNA 中创建基于图块的游戏。它向您展示了如何在视频 34 here 中进行移动。教程系列的播放列表是here
      3. 使用 XNA,但在 WinForms 应用程序中。如何做到这一点已回答 here,尽管对于 C#。代码很简单,转成VB应该不难。

      【讨论】:

      • 感谢您抽出宝贵时间帮助我!但是,这种方法有点过头了,因为我并不是真的在寻找这种口径的东西。尽管如此,它仍然很有帮助,我将来可能会使用它!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2011-05-27
      • 2011-10-10
      • 2015-02-24
      • 1970-01-01
      相关资源
      最近更新 更多