1

我曾尝试翻译(移动)画布,但我遇到了计时器问题。

我尝试了两种不同的方法:

第一种方法是BeginAnimation函数,第二种方法是DispatcherTimer刻度,但它们都非常不可靠。

我需要监控翻译的每一步。使用我尝试的第一种方法 ( BeginAnimation),我在Changed事件中执行了碰撞检测逻辑,而使用第二种方法 ( DispatcherTimer),我在Tick计时器事件中执行了碰撞检测逻辑。

问题是两者都非常不可靠。从某种意义上说,在我的碰撞检测逻辑中,画布应该在其属性 <= 0 时停止平移TranslateTransformY从技术上讲,如果它正在监视每一步,它应该每次都停在 0 处),但是我尝试了两种方法,它停止时会发生变化。例如,有时它停在 0 处,有时停在 -1、-2、-3 处,有时甚至停在 -4 处

那么这些差异是怎么回事?为什么它不像它应该的那样监控每一步?

我可以做些什么来为这个画布设置动画并真正监控每一步?我的意思是每一步......它移动的每一个像素

4

2 回答 2

2

您的问题是一切都是基于时间的,每次画布移动一个像素时您都不会收到回调,每次渲染帧时都会收到回调 - 系统甚至不会努力渲染帧一个恒定的速率。

最终结果就是你所看到的,有时你可以在移动 1/2 像素后得到回调,因为一切都很顺利,下一次移动两个像素时,因为 GC 在中间帧开始,之后的时间是 4像素移动是因为在后台运行的 Word 窃取了一些 CPU 周期来运行拼写检查程序。

这就是这些事情的工作方式,您可以处理它并为您的碰撞检测设置更高的容差,或者您可以在“虚拟时间轴”上运行屏幕外的模拟,您可以在不考虑现实的情况下以您想要的任何速度推进对象的屏幕动画。

我编写了对真实飞机进行模拟和碰撞检测的软件——我可以告诉你,这需要付出很多努力,为动画构建的任何框架都针对在屏幕上移动物体进行了优化,而不是你必须为高强度做的所有工作质量模拟,绝对不是为了准确的碰撞检测。

于 2009-02-26T09:32:16.713 回答
0

您应该挂钩CompositionTarget.Rendering事件。

当您挂钩此事件时,它会在每次即将渲染帧时触发,因此您可以根据自上次事件调用以来经过的时间来移动精灵。一旦您的精灵停止移动,您需要从事件中取消挂钩,因为只要有任何事件挂钩到事件中,WPF 就会尽可能快地渲染帧。

有关该事件以及如何使用它的更多信息,请尝试此博客条目,其中包含更多详细信息并包含您可以下载以查看的代码。

于 2009-02-25T23:36:24.387 回答