0

我基本上有一堆黑盒子,我希望玩家(PictureBox1)有重力,下落,撞到盒子,所以他们必须跳过它们......我有一切的基本运动,只是“物理学”我需要编码。

下面的代码在计时器上运行,因此它总是将玩家向下推 8,如果它与一个块相交,它就会开始向另一个方向推......

我将所有“块”与 Blocks(49) = Picturebox .. 分组,然后分别执行 Blocks(1)= Pictuebox1 , Blocks(2) = Picturebox2。很快...

 PictureBox1.Top += 8

    For x As Integer = 1 To 1

        If PictureBox1.Bounds.IntersectsWith(floor(x).Bounds) And floor(x).Visible = True Then
            standing = True
            PictureBox1.Top -= 1
        End If
    Next x

    For y As Integer = 1 To 49
        If PictureBox1.Bounds.IntersectsWith(blocks(y).Bounds) And blocks(y).Visible = True Then
            standing = True
            PictureBox1.Top -= 1
        End If

    Next y
4

1 回答 1

0

我将所有“块”与 Blocks(49) = Picturebox .. 分组,然后分别执行 Blocks(1)= Pictuebox1 , Blocks(2) = Picturebox2。很快...

我当然希望你不要做 Blocks(1)= Picturebox1 因为 PictureBox1 是你的播放器,而不是一个块 ;-) 此外,数组在 VB.NET 中是基于 0 的,所以你应该从索引 0 开始。在你的表单中,而不是命名你的块 PictureBox2、PictureBox3 等。我建议将它们命名为 BlockPicBox1、BlockPicBox2 等。然后你可以像这样分配你的数组:

Dim Blocks As PictureBox() = {BlockPicBox1, BlockPicBox2, BlockPicBox3, BlockPicBox4, ...}

现在让我们看看你的代码:

For x As Integer = 1 To 1
    ....
Next

这个循环是错误的。您想遍历所有楼层。使用 Count 属性确保循环遍历所有楼层,或者更好的是,使用 For Each 循环。

If PictureBox1.Bounds.IntersectsWith(floor(x).Bounds) And floor(x).Visible = True Then
    standing = True
    PictureBox1.Top -= 1
End If

条件看起来不错,但为什么要将 Top 属性减去 -1?您希望您的角色站在地板上,因此请相应地设置 Top 属性。

您还应该处理您的命名,这将有助于使您的代码更具可读性。例如,使用 PlayerPicBox 代替 PictureBox1。并为数组使用复数(“floors”而不是“floor”)。那将给出:

For Each currentFloor As PictureBox in floors
    If currentFloor.Visible AndAlso PlayerPicBox.Bounds.IntersectsWith(currentFloor.Bounds) Then
        standing = True
        PlayerPicBox.Top = currentFloor.Top - PlayerPicBox.Height
    End If
Next

同样的原则适用于您的第二个循环。

于 2012-12-07T14:36:07.507 回答