VB.NET-由于碰撞检测错误导致移动受阻

VB.NET-由于碰撞检测错误导致移动受阻,vb.net,graphics,logic,collision-detection,game-development,Vb.net,Graphics,Logic,Collision Detection,Game Development,所以,我正在为我的编程课制作一个游戏,作为我最终项目的一部分。我目前正处于计划和实验阶段,我决定在图形和碰撞方面取得领先。我第一次编写我的程序只是通过试验VB提供的Graphics类,而不是使用PictureBoxes。除此之外,我还添加了键盘输入来移动图像。当我决定通过Image类的intersectsWith()方法添加碰撞检测时,事情变得很奇怪 基本上,在我的代码中,“玩家”实体有三个不同的图像——它们根据它们面对的方向而变化,而这又取决于用户按下的键。在没有任何碰撞检测代码的情况下,移动

所以,我正在为我的编程课制作一个游戏,作为我最终项目的一部分。我目前正处于计划和实验阶段,我决定在图形和碰撞方面取得领先。我第一次编写我的程序只是通过试验VB提供的
Graphics
类,而不是使用
PictureBox
es。除此之外,我还添加了键盘输入来移动
图像。当我决定通过
Image
类的
intersectsWith()
方法添加碰撞检测时,事情变得很奇怪

基本上,在我的代码中,“玩家”实体有三个不同的图像——它们根据它们面对的方向而变化,而这又取决于用户按下的键。在没有任何碰撞检测代码的情况下,移动和图像更改工作正常,图像四处移动。然而,只要我添加碰撞检测,玩家就不会移动,只会改变他们面对的方式。即使玩家的
图像
与我要测试的交叉点图像(美元符号)相去甚远,也会发生这种情况。这是我的全部代码:

公共类表单1
枚举方向面向
转发
向后的
左边
正确的
结束枚举
'球员X位置。
尺寸pX为整数=100
'球员在Y位置。
将pY设置为整数=100
'玩家面对的方向-默认情况下,向后。
Dim dir As DirectionFacing=DirectionFacing.BACKWARD
“球员的形象。
将pI变暗为Image=My.Resources.main字符\u前进
“另一幅用于测试碰撞检测的图像。
Dim dI As Image=My.Resources.DollarSign
私有子表单1u KeyDown(ByVal sender作为System.Object,ByVal e作为System.Windows.Forms.KeyEventArgs)处理MyBase.KeyDown
如果(e.KeyCode=Keys.W),则
“如果他们按W,向前移动。
dir=方向朝前
pI=My.Resources.MainCharacter\u前进
移动球员(方向朝前,10)
ElseIf(e.KeyCode=Keys.S)则
'如果他们按S,则向后移动。
dir=DirectionFacing.BACKWARD
pI=My.Resources.main后面的字符
移动播放器(方向朝后,10)
ElseIf(e.KeyCode=Keys.A)然后
'如果他们按A,向左移动。
pI=My.Resources.MainCharacter\u端
dir=DirectionFacing.LEFT
移动播放机(朝向左,10)
ElseIf(e.KeyCode=Keys.D)则
'如果他们按D,向右移动。要使玩家面向右侧,
'图像可以翻转。
变暗翻转为Image=My.Resources.main字符侧
翻转的.RotateFlip(RotateFlipType.RotateNoneFlipX)
pI=翻转
dir=DirectionFacing.LEFT
移动播放机(方向朝右,10)
如果结束
端接头
'移动玩家一定数量并检查碰撞。
私有Sub-movePlayer(dir作为DirectionFacing,amount作为整数)
如果(dI.GetBounds(GraphicsUnit.Pixel).intersects与(pI.GetBounds(GraphicsUnit.Pixel)),则
返回
如果结束
如果(dir=DirectionFacing.FORWARDS),则
pY-=10
ElseIf(dir=directionfaceting.BACKWARD)然后
pY+=10
ElseIf(dir=directionfaceting.LEFT)然后
pX-=10
ElseIf(dir=directionfaceting.RIGHT)然后
pX+=10
如果结束
端接头
私有子绘图(ByVal sender作为对象,ByVal e作为System.Windows.Forms.PaintEventArgs)处理Me.Paint
尺寸g作为图形=e.图形()
g、 DrawImage(dI,400350)
g、 绘图图像(pI、pX、pY)
使无效
端接头
私有子表单1_Load(发送方作为对象,e作为事件参数)处理MyBase.Load
Me.DoubleBuffered=True
端接头
末级
基本上,每次我按下一个键,希望图像移动,图像根本不会移动(即使玩家离美元符号很远),但他们面对的方向仍然会改变。我怎样才能让玩家保持移动,同时又能阻止玩家与另一张图像发生碰撞?

好吧

If(dI.GetBounds(GraphicsUnit.Pixel).IntersectsWith(pI.GetBounds(GraphicsUnit.Pixel)))

将始终返回
False
,因为
GetBounds
方法不返回每个矩形的当前位置。因此它们永远不会相交,并且您的绘图场景保持不变

所以让我们试着解决这个问题

Enum定向
转发
向后的
左边
正确的
结束枚举
“球员的形象。
将pI设置为新位图(My.Resources.MainCharacter\u Forward)
“另一幅用于测试碰撞检测的图像。
Dim dI作为新位图(My.Resources.DollarSign)
'玩家图像的矩形。
将pIrect变为新矩形(100、100、pI.宽度、pI.高度)
'碰撞图像的静态矩形。
直接变暗为新矩形(400、350、dI.宽度、dI.高度)
现在,
IntersectWith
函数应该在
movePlayer
方法中工作:

Private Sub-movePlayer(dir作为directionface,amount作为整数)
尺寸px=体积X
Dim py=pIrect.Y
选择案例目录
正面朝前
py-=金额
大小写方向朝后
py+=金额
案例方向面向左
px-=数量
案例方向:右
px+=数量
结束选择
如果不是新矩形(px,py,pI.Width,pI.Height),则与(dIrect)相交
pIrect=新矩形(px,py,pI.宽度,pI.高度)
使无效
如果结束
端接头
注意,
px
py
变量现在都是局部变量,因为我们已经有了
pIrect
,其中包括currect
x