碰撞检测只添加+1一次,而不是几次的对象碰撞
本文关键字:几次 碰撞 对象 添加 一次 碰撞检测 | 更新日期: 2023-09-27 17:54:12
<UserControl x:Class="CatGame.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="480" d:DesignWidth="640" KeyDown="UserControl_KeyDown">
<Canvas x:Name="LayoutRoot" Background="white">
<Image Source="level1.jpg"></Image>
<TextBlock FontSize="24" Canvas.Left="700" Canvas.Top="90" Name="score">/TextBlock>
</Canvas>
</UserControl>
if (DetectCollisionZero(myCat, myZero))
{
int scoreAsInt;
if (Int32.TryParse(score.Text, out scoreAsInt) != null)
{
scoreAsInt = scoreAsInt + 1;
score.Text = scoreAsInt.ToString();
}
LayoutRoot.Children.Remove(myZero);
}
public bool DetectCollisionZero(ContentControl myCat, ContentControl myZero)
{
Rect myCatRect = new Rect(
new Point(Convert.ToDouble(myCat.GetValue(Canvas.LeftProperty)),
Convert.ToDouble(myCat.GetValue(Canvas.TopProperty))),
new Point((Convert.ToDouble(myCat.GetValue(Canvas.LeftProperty)) + myCat.ActualWidth),
(Convert.ToDouble(myCat.GetValue(Canvas.TopProperty)) + myCat.ActualHeight))
);
Rect myZeroRect = new Rect(
new Point(Convert.ToDouble(myZero.GetValue(Canvas.LeftProperty)),
Convert.ToDouble(myZero.GetValue(Canvas.TopProperty))),
new Point((Convert.ToDouble(myZero.GetValue(Canvas.LeftProperty)) + myZero.ActualWidth),
(Convert.ToDouble(myZero.GetValue(Canvas.TopProperty)) + myZero.ActualHeight))
);
myCatRect.Intersect(myZeroRect);
return !(myCatRect == Rect.Empty);
}
我基本上有一只猫与一个对象(myZero)碰撞,当这种情况发生时,我的分数应该加1,这种工作,但是一旦(myZero)被删除,用户仍然可以去对象的位置,并获得更多的积分。
我怎样才能使它只添加一个点呢?
在您从画布中删除myZero
之后,为什么您会期望这做任何不同的事情?你的碰撞检测方法只是读取决定myZero
的边界框的属性(属性不会因为你从集合中删除它而改变),将其与myCat
的边界框进行比较,并决定它们是否相交。myZero
是否仍在LayoutRoot.Children
集合中,DetectCollisionZero
中的任何行为都不会有所不同。
如果你想让它做一些不同的事情,你将不得不编写一些代码来检查你感兴趣的条件(myZero
不再被认为是游戏板的一部分)并做出适当的反应(在检查碰撞时不再返回true
)。