Visual Basic 2010 Express平滑WASD控件

时间:2014-11-20 00:05:13

标签: visual-studio-2010

我目前正在使用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 生涩。最重要的是,它无法沿对角线方向移动。我认为这会产生一个非常不实用的游戏,因为用户可能会对类似slug的运动步伐感到非常无聊。有没有办法简单地编程一个Picturebox快速移动2像素增量和平滑(即在改变方向之前没有延迟)?谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

现在你需要一个"游戏循环"使用这些命令来实现控件的移动。这可以像Timer一样简单,将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

答案 1 :(得分:0)

尝试使用KeyPress方法代替KeyDown,

如果不起作用,则必须将代理添加到代码中。

检查MSDN以获取重新http://msdn.microsoft.com/en-us/library/ms172879.aspx

答案 2 :(得分:0)

回答您关于如何以2像素的增量快速移动图片框的问题, 我建议您按照以下替代策略之一进入图片框,因为我知道无法用图片框以优化的方式制作动画。

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