我正在制作复古街机游戏“小行星”,并且在碰撞检测到撞击小行星并将其分成碎片时遇到了一些麻烦。
使用以下代码,我在第二个子例程开始时的If语句中出错: 没有为类型'System.Windows.Forms.PictureBox'和'System.Windows.Forms.PictureBox'定义Operator'='。
Private Sub CollisionDetection_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CollisionDetection.Tick
Dim Asteroids() = {picLrgAsteroid100, picLrgAsteroid200, picLrgAsteroid300, picLrgAsteroid400, picLrgAsteroid500}
'Stores all asteroids, used for testing collision for all asteroids
For Each PictureBox In Asteroids
'For all asteroids
If PictureBox.Bounds.IntersectsWith(picBullet1.Bounds) Then
Me.Controls.Remove(picBullet1)
AsteroidDestroyer(PictureBox)
ElseIf PictureBox.Bounds.IntersectsWith(picBullet2.Bounds) Then
Me.Controls.Remove(picBullet2)
ElseIf PictureBox.Bounds.IntersectsWith(picBullet3.Bounds) Then
Me.Controls.Remove(picBullet3)
End If
'If it intersects with a bullet
'Remove the bullet, and transmit to break apart the asteroid
Next
End Sub
Public Sub AsteroidDestroyer(ByVal Asteroid As System.Windows.Forms.PictureBox)
If Asteroid = picLrgAsteroid100 Then
*
*
*
End if
由于我正在使用for ...每个语句,我如何通过“对于小行星中的每个PictureBox”传输哪个PictureBox到子程序'AsteroidDestroyer'并让它接收,然后使用它if语句?
示例(伪代码):
sub CollisionDetection
If PictureBox (picLrgAsteroid100) intersects with picBullet1 then
Remove picBullet1
Transmit to AsteroidDestroyer(picLrgAsteroid100)
End if
End Sub
Sub AsteroidDestroyer(ByVal Asteroid as PictureBox)
If Asteroid = picLrgAsteroid100 then
End If
End Sub
如果你能看到任何改进的方法,为了避免这个问题,我没有理由像现在这样做,所以随时建议!
答案 0 :(得分:0)
在非专业术语中,您试图比较两个包含引用的变量,在这种情况下,是同一个对象(或可能是同一个对象)。而头号可以"相等"第一个,或包含第一个的变量可以等于"另一个包含数字1的变量,相反,一个对象不能等于自己。平等是对象的属性或值的特征。
在比较对象的引用的情况下,vb.net提供Is Operator。您可能习惯于将值或属性与等号进行比较,
If var1 = var2 Then
执行对象引用的比较,而不是使用“Is”。
If objRef1 Is objRef2 Then
=
和Is
都返回一个表示成功或失败的布尔值(相等/真,或不等/假),但等号比较一个值,Is
比较一个引用而不考虑引用的属性。
在您的具体情况下,这转换为,
If Asteroid Is picLrgasteroid100 Then