对象Aren未分配给数组

时间:2016-05-24 10:55:22

标签: arrays vb.net nullreferenceexception

我正在学校使用Visual Basic .NET为IPT创建一个视频游戏。

游戏是一种自上而下的射手/冒险游戏,玩家可以控制他们的角色向上,向下,向左,向右和对角,并且必须获得一个物体来完成关卡。在路上是阻挡或杀死玩家角色的敌人和障碍。

我试图想出一个简单的方法来分配所有想要成为障碍物的图片框......好吧,阻挡玩家的障碍物,然后让玩家的移动计时器以其中任何一个为准方向停止通过改变为一个长间隔(如果我只是让计时器停止,它将在箭头键被保持时再次开始,因此当玩家在该方向上握住箭头键时导致口吃)。为了这个问题,我只为玩家提供了一个if语句" up"运动。

我一直在使用我在教科书中找到的一些代码来识别"敌人",我在其中创建一个数组并将对象定义为 obj ,将整数定义为 I ,然后对于表单中的每个控件,检查它是否是一个图片框并且具有特定标记,如果是,则将其分配给数组。 然后对于像碰撞这样的东西,对于 = 0要无论,如果玩家与指定的对象相交,那么就会发生yadda yadda。像这样:

Public Class Form2
Dim Skeleton(1) As PictureBox

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim obj As Object, I As Integer = 0
For Each obj In Me.Controls
            ' assign picture boxes with "skeleton" tag to Skeleton array
            If TypeOf obj Is PictureBox AndAlso obj.tag = "skeleton" Then
                Skeleton(I) = obj
                I += 1
            End If
        Next

Private Sub tmrMovement_Tick(sender As Object, e As EventArgs) Handles tmrMovement.Tick
        For I = 0 To 1
            If Collision(Skeleton(I), picPlayer) Then
                picPlayer.Visible = False
                MsgBox("You died!" & Environment.NewLine & "Try again!")
                Reset()
            End If

工作得很好。所以我想如果我想快速识别玩家无法通行的块,我只需使用另一个整数 J 和对象 otherobj ,另一个阵列。例如:

Public Class Form2
    Dim Border(7) As PictureBox

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim obj As Object, I As Integer = 0, otherobj As Object, J As Integer = 0
        For Each otherobj In Me.Controls
            ' Assign picture boxes with "border" tag to Border array
            If TypeOf otherobj Is PictureBox AndAlso otherobj.tag = "border" Then
                Border(J) = otherobj
                J += 1
            End If
        Next

Private Sub PicPlayer_LocationChanged(sender As Object, e As EventArgs) Handles picPlayer.LocationChanged
For J = 0 To 7
            If Border(J).Bounds.IntersectsWith(picPlayer.Bounds) Then
                If tmrUp.Enabled Then
                    tmrUp.Stop()
                    tmrUp.Interval = 10000
                End If
            End If
        Next

但是,我得到一个空引用异常,并且在运行时分配永远不会发生,J保持为0.但是,我有一个私有子用于计时器滴答(一个永远启用的计时器,用于我已经将它用于敌人的移动),如果每个循环的都在那个子中,而不是picPlayer_LocationChanged子,那么它确实有用!物体碰撞了!

我的(新)问题: 为什么迭代在播放器对象的LocationChanged事件中显示NullReferenceException错误,但是如果我在计时器的Tick事件中有它,它会完全正常吗?

1 个答案:

答案 0 :(得分:0)

你的问题是当你还没有控制时你试图做某事。表单开始加载时,表单加载事件开始。对此的解决方案是使用在表单加载后发生的form shown事件:

Private Sub Form1_Shown(sender as Object, e as EventArgs) Handles Form1.Shown
   MessageBox.Show("You are in the Form.Shown event.")
End Sub

此外,您可以循环显示图片框。应用this解决方案,您可以这样:

Dim i As Integer = 0
For Each pictureBox As var In PictureTab.Controls.OfType(Of PictureBox)()
    pictureBox.Picture = cboProperty.Column(i)
    i += 1
Next