【问题标题】:WPF animation, check for overlapping?WPF动画,检查重叠?
【发布时间】:2018-08-16 17:05:15
【问题描述】:

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


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

我正在制作一个模拟软件,其中涉及让一些 UIElement 沿路径设置动画。目前我有 20 个项目遵循这条路径,并且运行良好。

为此,我只创建了一个 20 的循环,在循环内,我正在创建 UIElement、情节提要等,然后开始。我等待大约 100 毫秒然后重复。这在元素之间提供了一个很好的间隙。

无论如何,以上内容都可以正常工作。现在下一点。在 sim 的任何位置,UIElement 都可以停止在它所在的位置。现在,当这种情况发生时,我希望其他 UIElement 继续运行,直到它们碰到停止的元素,并且它们 1 接 1 堆积在它后面。

所以知道如何检查重叠/相交/碰撞,我如何在元素动画期间进行检查。

【问题讨论】:

  • “这仅仅是创建一个计时器的简单案例,它每隔 100 毫秒就响一次,然后循环所有 UI 元素以查看它们是否重叠?” - 也许。你试过吗?有什么代码可以显示吗? How to Ask。祝你好运
  • @MickyD 不,我现在正在尝试。但即使它有效,我也试图了解什么是最好的方法。如果计时器是最好的方法,那么有人可以说是的,这是唯一的方法,这很好,但其他人可能会说“不,你不想这样做,因为准确性会很差,你应该这样做”。
  • 当我认为超出动画范围的元素停止时,您需要检查所有移动元素是否发生碰撞。
  • @MickyD 我不认为要求最好的方法一定是题外话。问一个完全基于意见的问题是。
  • @MickyD,单独的碰撞检测是一个重复的问题,而不断移动的物体的碰撞检测似乎是一个重复,需要更多说明。在问了 OP 几个问题之后,我的问题变得非常清楚。对于像我这样的 Unity 开发人员来说,这是一件很常见的事情,并且没有直接的解决方案,只有提示和技巧。如果 OP 想要一个复杂形状的元素,他会立即提出要求,但我们确实认为它是一个简单的形状。我个人认为问题和答案可以帮助未来的读者。

标签: c# wpf animation


【解决方案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 次碰撞 (这很糟糕)。您可以通过尽可能减少比较次数来提高此瓶颈的效率。例如,由于对象沿公共路径移动,您可以仅将停止的元素与其前一个元素进行比较。你可以确保一个有序的元素集合来实现这一点。

由于所有元素都遵循共同的路径(一次发生一次冲突):

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

【讨论】:

  • 这已经回答了我的问题,谢谢 Bijan 的帮助。
  • @MickyD,我特别说过不要在我的答案中的一次更新期间检查所有元素是否发生冲突。
  • @MickyD,你说得对,我忘了在我的回答中包含聊天中的一些重要的 cmets。尽量保持简单。
  • 没问题的好先生。我会提前投票。祝你幸福快乐 Unity'ing :)
  • @ASh - “偷来的”是一个自嘲的笑话。没有在没有注明出处的情况下复制任何措辞,并且他们提供了适当的引用来说明他们在答案中提取代码的位置。我处理(并删除)了很多抄袭,但这不符合条件。
猜你喜欢
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
相关资源
最近更新 更多