所以我安装了物理助手,但上面提供的那个不能与任何构建过去芒果的 Windows 手机一起使用。所以我找到了 Physics Helper XAML,它不是一个安装文件,并且在可预见的将来必须使用糟糕的文档才能使用它。
所以我创建了自己的 XAML 碰撞检测系统。它非常简单,可以满足我的需要并且速度很快。
最重要的是,尽管您可以在 Blend 或 WYSISYG 编辑器中编辑您的画布,但它不会破坏代码。
首先,我使用我希望可碰撞的项目创建嵌套画布
<Canvas x:Name="Collidables">
<Image x:Name="star" Width="50" Height="50" Source="images/star.png" Canvas.Left="54" Canvas.Top="-132"/>
<Image x:Name="star_Copy" Width="50" Height="50" Source="/images/star.png" Canvas.Left="158" Canvas.Top="-190"/>
<Image x:Name="star_Copy1" Width="50" Height="50" Source="/images/star.png" Canvas.Left="268" Canvas.Top="-260"/>
<Image x:Name="star_Copy2" Width="50" Height="50" Source="/images/star.png" Canvas.Left="372" Canvas.Top="-322"/>
<Image x:Name="star_Copy3" Width="50" Height="50" Source="/images/star.png" Canvas.Left="54" Canvas.Top="-390"/>
<Image x:Name="star_Copy4" Width="50" Height="50" Source="/images/star.png" Canvas.Left="158" Canvas.Top="-448"/>
<Image x:Name="star_Copy5" Width="50" Height="50" Source="/images/star.png" Canvas.Left="268" Canvas.Top="-518"/>
<Image x:Name="star_Copy6" Width="50" Height="50" Source="/images/star.png" Canvas.Left="372" Canvas.Top="-580"/>
<Image x:Name="star_Copy7" Width="50" Height="50" Source="/images/star.png" Canvas.Left="372" Canvas.Top="-798"/>
<Image x:Name="star_Copy8" Width="50" Height="50" Source="/images/star.png" Canvas.Left="268" Canvas.Top="-882"/>
<Image x:Name="star_Copy9" Width="50" Height="50" Source="/images/star.png" Canvas.Left="158" Canvas.Top="-982"/>
<Image x:Name="star_Copy10" Width="50" Height="50" Source="/images/star.png" Canvas.Left="54" Canvas.Top="-1060"/>
</canvas>
然后你可以去后面的代码做剩下的事情##注意每个项目都是唯一的##
在游戏循环中,我声明了以下方法来检查碰撞检测
collisionChecks();
handleCollisions();
所以第一种方法中发生的事情是这样的:
可碰撞画布中的所有元素都被拉到一个列表中
为了节省检查甚至不在屏幕上的项目,我通过说元素的顶部是否在屏幕上将其添加到碰撞启用列表中将其清除,否则忘记它。
public void collisionChecks()
{
List<UIElement> AllCollidables = Collidables.Children.ToList();
collisionEnabled.Clear();
foreach (UIElement item in AllCollidables)
{
if (Canvas.GetTop((Image)item) + canvasShift > 0)
collisionEnabled.Add(item as Image);
}
}
现在我们可以处理符合碰撞条件的对象
第一个 foreach 循环检查玩家和碰撞启用列表中的每个对象之间是否存在碰撞。
如果发生碰撞,它会被添加到 Collisions to handle 列表中
一旦我们拥有所有实际发生碰撞的对象,我们就可以根据它们的名称单独处理它们以确定如何处理它们。例如,在这段代码中,我说如果名称包含“star”,那么让它消失,很快它也会播放声音。但我也可以说,如果它包含“火箭”,那么将玩家状态更改为飞行或其他。
public void handleCollisions()
{
Rect player = new Rect();
player.X = Canvas.GetLeft(Player);
player.Y = Canvas.GetTop(Player);
player.Height = Player.Height;
player.Width = Player.Width;
foreach (Image item in collisionEnabled)
{
if (item.Visibility == Visibility.Visible)
{
Rect obj = new Rect();
obj.X = Canvas.GetLeft(item);
obj.Y = Canvas.GetTop(item) + canvasShift;
obj.Height = item.Height;
obj.Width = item.Width;
obj.Intersect(player);
if (!obj.IsEmpty)
{
collisionsToHandle.Add(item);
}
}
}
foreach (Image item in collisionsToHandle)
{
item.Visibility = Visibility.Collapsed;
if (item.Name.ToLower().Contains("star"))
{
score += 100;
}
}
collisionsToHandle.Clear();
collisionEnabled.Clear();}
这不是实现碰撞检测系统的最干净的方法,但它是我想出的最小和最快的方法。希望这可以帮助任何对 XAML 对象的简单 2D 碰撞检测感兴趣的人