WPF动画,检查是否重叠?

时间:2018-08-15 08:45:11

标签: c# wpf animation

注意::请务必阅读让我们继续聊天中的讨论以获取背景说明


我在这里看到了一些帖子以及用于检查控件是否重叠的教程,但是在动画过程中检查控件的最佳方法是什么?

我正在制作一个仿真软件,其中涉及使一些UIElement沿路径动画。目前,我遵循此路径有20条,效果很好。

为此,我只创建了一个20的循环,并在循环内部创建了UIElement,情节提要等,然后开始。我等待约100毫秒,然后重复。这样可以在元素之间留出很大的空隙。

无论如何,以上都可以正常工作。现在下一位。在Sim的任何时候,UIElement都可以停在原处。现在,当发生这种情况时,我希望其他UIElement继续前进,直到它们撞到停止的元素为止,并以1比1的方式堆叠在其后面。

因此,知道如何检查重叠/交叉/碰撞时,如何在元素动画期间进行检查。

1 个答案:

答案 0 :(得分:1)

从本质上讲,碰撞检测需要一个不断检查的计时器。因为WPF中没有碰撞事件。

您可以检查两个Rect对象与rect1.IntersectsWith(rect2)的碰撞情况

取自here

您可以使用

找到元素相对于其父元素的Rect
public static Rect BoundsRelativeTo(this FrameworkElement element,
                                         Visual relativeTo)
{
  return
    element.TransformToVisual(relativeTo)
           .TransformBounds(LayoutInformation.GetLayoutSlot(element));
}

取自here

问题是一次将多少个元素放入计时器的瓶颈中,如果冲突检测始终涉及停止的元素,则该元素负责冲突检测。否则,您将需要检查n ^ 2个冲突 (不好)。您可以通过尽可能减少比较次数来解决此瓶颈的问题。例如,由于对象沿公共路径移动,因此只能将停止的元素与其先前的元素进行比较。您可以确保元素的排序集合来实现。

由于所有元素都遵循相同的路径(一次发生一次碰撞):

  • 在第一个元素停止时启动计时器。并将其设置为参考元素
  • 将所有必需元素与参考元素进行比较
    • 当碰撞元素发生碰撞时更改参考元素
相关问题