2

参考我目前正在构建的这个编程游戏。

重要提示:向下滚动查看[编辑]

用户可以在我的游戏中调用的一些方法将是对机器人进行 Translate Transform 的方法(Canvas基本上是一个)。

从 move 方法中,我知道了 Robot 当时将要面对的航向(角度),也知道 Robot 想要移动的像素长度。

现在,我面临的问题是如何将画布(在计时器中)平移到当前的面向角度?

替代文字 http://img8.imageshack.us/img8/3606/robottranslatemovementfu3.jpg

一定有一些我在这里遗漏的数学,但我只是不知道在每个 Timer 滴答声中要解决什么问题。

这是被调用的方法,它包含每 5 毫秒计时一次的计时器,为运动设置动画:

public void Ahead(int pix)
    {
        eventQueue.Enqueue((TimerDelegate)delegate(DispatcherTimer dt)
        {
            /* Available Variables:
            Translate_Body.X <= Current Robot Location on X-axis
            Translate_Body.Y <= Current Robot Location on Y-axis
            Bot.Body <= The Canvas that needs to be translated (moved)

            To translate the robot, I just basically do this:
                Translate_Body.X++; or Translate_Body.YY++; to increment, or -- to decrement ofcourse

            Now I need to figure out the logic on when to increment (or decrement, according to the angle I suppose) the Y and X
            */

            IsActionRunning = true;
            dt.Tick += new EventHandler(delegate(object sender, EventArgs e)
            {
                lock (threadLocker)
                {
                     //The logic needs to happen in here, with each timer tick.
                     //so with each timer tick, the robot is moved on pixel according to its angle.
                     //Then I need to make a condition that will indicate that the robot has arrived at its destination, and thus stop the timer.
                }
            });    
            dt.Start();
        });
    }

[重要编辑]

我现在已经更改了我的逻辑,使用 WPFBeginAnimation而不是自动收报机来为我制作动画。所以现在我不需要计算每个刻度的新坐标,但我只提供结束坐标,然后BeginAnimation将在一段时间内转换它:

public void Ahead(int pix)
    {
        eventQueue.Enqueue((TimerDelegate)delegate
        {

            Animator_Body_X.From = Translate_Body.X;
            Animator_Body_X.To = //The end X-coordinate
            Translate_Body.BeginAnimation(TranslateTransform.XProperty, Animator_Body_X);

            Animator_Body_Y.From = Translate_Body.Y;
            Animator_Body_Y.To = //The end Y-coordinate
            Translate_Body.BeginAnimation(TranslateTransform.YProperty, Animator_Body_Y);
        });
    }

所以现在,给定画布当前旋转的角度(0-359),起始x和y坐标(画布当前所在的位置)和距离,我如何计算结束坐标?


更新:解决方案

4

2 回答 2

1

为了帮助数学:

如果您想在t秒内移动d个像素距离,那么您需要平均移动 x/t(像素/秒)。

为此,您需要存储动画的开始时间 (start_time)。

在每个计时器滴答声中,计算动画完成的百分比:

percent_complete= (now - start_time) / t

将 percent_complete 乘以您想要移动的距离,以获得您应该距起点 (d_now) 的距离。请记住在开始动画时跟踪开始距离。

d_now = percent_complete * d

然后可以通过以下方式计算机器人当前计时器滴答的 x 和 y:

x = d_now * cos(heading) + start.x
y = d_now * sin(heading) + start.y

您可能需要调整事物的迹象,但这就是要点。抛开数学不谈,WPF 中不是已经为您提供了基本的动画例程吗?我从未使用过它,但这是我的印象。 链接

于 2009-02-10T02:24:57.563 回答
0

解决方案

感谢Andy MikulaCameron MacFarland的帮助,它终于按预期工作了。

这是工作代码:

double headingRadians = Heading * (Math.PI / 180);

Animator_Body_X.From = Translate_Body.X;
Animator_Body_X.To = Math.Sin(headingRadians) * pix + Translate_Body.X;
Translate_Body.BeginAnimation(TranslateTransform.XProperty, Animator_Body_X);

Animator_Body_Y.From = Translate_Body.Y;
Animator_Body_Y.To = ((Math.Cos(headingRadians) * pix) * -1) + Translate_Body.Y;
Translate_Body.BeginAnimation(TranslateTransform.YProperty, Animator_Body_Y);
于 2009-03-14T12:42:24.327 回答