我希望在Visual Basic中找到一些基本上说明如果某些东西与某个类碰撞的东西,它会执行代码。我可能没有使用正确的术语,所以当我说对象时我的意思就像一个标签或图片框,一个类......就像一个HTML类,我想,就像一个具有特征的对象。
伪代码看起来像这样:
If object.Bounds.IntersectsWith([object with certain class]) Then execute code
否则,游戏'如果'语句将不堪重负...我也是Visual Basic语言的新手,所以请尽量保持简单。
这是我已经拥有的:
If carblue.Bounds.IntersectsWith(boundary1.Bounds) And directiona = 1 Then
directiona = 0
carblue.Top += 2
ElseIf carblue.Bounds.IntersectsWith(boundary1.Bounds) And directiona = 2 Then
directiona = 0
carblue.Left += 2
ElseIf carblue.Bounds.IntersectsWith(boundary1.Bounds) And directiona = 3 Then
directiona = 0
carblue.Top -= 2
ElseIf carblue.Bounds.IntersectsWith(boundary1.Bounds) And directiona = 4 Then
directiona = 0
carblue.Left -= 2
End If
如果汽油是被控制的物体,则border1是阻止汽车移动(碰撞时)的障碍物,而directiona是汽车行驶方向的值(1为向上,2为剩余等)。< / p>
(移动自S.A。程序员网站)
答案 0 :(得分:0)
如果没有实际的示例代码,提供特定的解决方案并不容易。我不知道你有多少控件移动,是2吗? 10?万?假设你有10个以上的控件移动,这就是我将如何处理它。
我会使用数据表来记录每个移动或可碰撞的控件的边界。控件移动后,更新数据表中的该行,查找冲突,然后检查对象类型以确定冲突对象的类类型,然后根据需要运行代码。
Public MovingControls As DataTable
Sub Main()
'Build the DataTable
MovingControls = New DataTable("ControlBounds")
MovingControls.Columns.Add("Name", GetType(String))
MovingControls.Columns.Add("x1", GetType(Integer))
MovingControls.Columns.Add("x2", GetType(Integer))
MovingControls.Columns.Add("y1", GetType(Integer))
MovingControls.Columns.Add("y2", GetType(Integer))
End Sub
'Call this only when a control/object is created
Sub MovingControlAdded(sender As Control)
Dim Row As DataRow = MovingControls.NewRow
Row("Name") = sender.Name
Dim BoundsRect As Drawing.Rectangle = sender.Bounds
Row("x1") = sender.Bounds.Left
Row("x2") = sender.Bounds.Right
Row("y1") = sender.Bounds.Bottom
Row("y2") = sender.Bounds.Top
MovingControls.Rows.Add(Row)
End Sub
'Call this only when a control/object has moved
Sub MovingControlMoved(sender As Control)
'Update the location of this Control
Dim Row() As DataRow = MovingControls.Select("Name = '" & sender.Name & "'")
'Select returns an array of Rows but there should only be 1 row for each Control
Row(0)("x1") = sender.Bounds.Left
Row(0)("x2") = sender.Bounds.Right
Row(0)("y1") = sender.Bounds.Bottom
Row(0)("y2") = sender.Bounds.Top
'Collision check
Dim CollidedRows() As DataRow = MovingControls.Select("(" & sender.Bounds.Right & " >= x1)" &
"AND (" & sender.Bounds.Left & " <= x2)" &
"AND (" & sender.Bounds.Bottom & " <= y2)" &
"AND (" & sender.Bounds.Top & " >= y1)" &
"AND (Name <> '" & sender.Name & "'")
'Determine the object type and execute necessary code
For Each CollidedRow As DataRow In CollidedRows
Dim CollidedControl As Control = Me.Controls.Item(CollidedRow("Name"))
If CollidedControl.GetType = GetType(Label) Then
'Do stuff for labels
ElseIf CollidedControl.GetType = GetType(Button) Then
'Do stuff for buttons
End If
Next
End Sub
警告:这假设一次控制一个控制。如果控制A移动到控制B但控制B同时移开,则即使避免了碰撞,该代码仍会调用碰撞。如果有多个控件移动,您可能希望将MovingControlMoved方法拆分为2个方法,一个用于更新表,另一个用于碰撞检查。首先处理所有运动,然后处理所有碰撞。
根据复杂程度,您可能希望为可继承控件的自定义类创建自定义类,以继承碰撞接口。您可以使用System.Reflection来调用RunMeOnCollision。这将消除If语句列表。
Interface iCollidableBase
Sub RunMeOnCollision()
End Interface
Public Class CollidableLabel
Inherits Label
Implements iCollidableBase
Public Sub RunMeOnCollision() Implements iCollidableBase.RunMeOnCollision
Me.Text = "I have been collided"
End Sub
End Class
Public Class CollidableButton
Inherits Button
Implements iCollidableBase
Public Sub RunMeOnCollision() Implements iCollidableBase.RunMeOnCollision
Me.Text = "Ouch, that collision hurt!"
End Sub
End Class
同样,我不知道这里的完整上下文,我无法针对您的代码测试我的解决方案。如果您可以发布一些其他详细信息,我可以提供更多帮助。
-E
答案 1 :(得分:0)
我使用数组从编程老师那里找到了我需要的东西。
在公共子:
Dim walls(17) As PictureBox
其中17是表单所具有的(在本例中)边界的数量。同时将PictureBox更改为您正在使用的对象(例如标签)。
然后在表单中加载:
For i = 1 To 17
walls(i) = Me.Controls("boundary" & i)
Next
老实说,我不是百分之百确定这一点,而是&#34;界限&#34; string是my PictureBoxes名称的一部分,用作边界。名称是boundary1,boundary2等。所以你可以改变&#34; boundary&#34;你对象的名字是什么。
接下来,当您想使用边界检查某些内容时,请声明
For i = 1 To 17
然后当你想要关闭它时,
Next
要检查碰撞,请使用:
If object.Bounds.IntersectsWith(walls(i).Bounds) Then
因此,在这种情况下,If语句将介于For和Next行之间。