请选择 进入手机版 | 继续访问电脑版
查看: 1476|回复: 2

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三)让物体动起来③

[复制链接]
发表于 2012-2-4 10:38:14 | 显示全部楼层 |阅读模式
第三种方法,DispatcherTimer动画,该类型动画与CompositionTarget动画类似,是基于界面线程的逐帧动画,但他与CompositionTarget动画不同,DispatcherTimer动画可以轻松的进行参数设置:
        xaml界面代码仍然沿用第一节的,那么接下来我们在后台代码中创建相关对象:
        Rectangle rect; //创建一个方块作为演示对象
        double speed = 5; //设置移动速度
        Point moveTo; //设置移动目标
        public Window3() {
            InitializeComponent();
            rect = new Rectangle();
            rect.Fill = new SolidColorBrush(Colors.Red);
            rect.Width = 50;
            rect.Height = 50;
            rect.RadiusX = 5;
            rect.RadiusY = 5;
            Carrier.Children.Add(rect);
            Canvas.SetLeft(rect, 0);
            Canvas.SetTop(rect, 0);
            //定义线程
            DispatcherTimer dispatcherTimer = new DispatcherTimer(DispatcherPriority.Normal);
            dispatcherTimer.Tick += new EventHandler(Timer_Tick);
            dispatcherTimer.Interval = TimeSpan.FromMilliseconds(50); //重复间隔
            dispatcherTimer.Start();
        }

        private void Carrier_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
            moveTo = e.GetPosition(Carrier);
        }

        private void Timer_Tick(object sender, EventArgs e) {
            double rect_X = Canvas.GetLeft(rect);
            double rect_Y = Canvas.GetTop(rect);
            Canvas.SetLeft(rect, rect_X + (rect_X < moveTo.X ? speed : -speed));
            Canvas.SetTop(rect, rect_Y + (rect_Y < moveTo.Y ? speed : -speed));
        }
    与上一节的代码类似,不同的地方其实也就是声明动画线程处,共4句:
        DispatcherTimer dispatcherTimer = new DispatcherTimer(DispatcherPriority.Normal);
        dispatcherTimer.Tick += new EventHandler(Timer_Tick);
        dispatcherTimer.Interval = TimeSpan.FromMilliseconds(50);
        dispatcherTimer.Start();
    第一句申明一个界面计时器DispatcherTimer ,并且设置其线程优先级别为Normal,这是标准设置,你可以根据你自己的需求进行更改,一共10个级别。
    第二句注册Tick 事件,也就是计时器间隔触发的事件。
    第三句设置Tick 事件的间隔,可以有很多方式,我使用的是TimeSpan.FromMilliseconds(),即间隔单位为毫秒。
    第四句启动线程。
    是不是很简单?这样的话可以很轻松的通过Interval 来控制刷新一个对象属性的频率了。接下来我们同样使用Ctrl+F5来测试一下成果。呵呵,结果和第二种动画方法是一样的,存在同样的问题,因为毕竟两种动画的原理是一致的。
    那么到此,三种动态创建动画的方法都已经详细介绍过了,大家可能会有种感觉,比较钟情于第一种WPF/Silverlight推荐的Storyboard动画,既直观又方便使用,而且仿佛不易出错。其实这3种动画都有它特定的使用场合。
    第一种动画适合创建简单的对象位移及直接性质的属性更改(在后面的教程中,我还将更深入的挖掘Storyboard动画的潜力,动态创建更复杂的基于KeyFrame的关键帧动画)。
    第二种动画适合全局属性的时时更改,例如我们后面要讲到的敌人或NPC以及地图等全体性的相对位移及属性更改时就要用到它了。
    第三种动画则非常适合运用在Spirit(角色)的个人动画中,例如角色的移动,战斗,施法等动作。
    小结:前三节分别讲解了Storyboard动画,CompositionTarget动画,DispatcherTimer动画,并横向分析了不同的场合对应不同的动画应用模式,这些将是构成WPF/Silverlight游戏引擎的基础。
    下一节我将介绍如何使用DispatcherTimer动画让对象活起来,敬请关注。


该贴已经同步到 LEE的微博
回复

使用道具 举报

发表于 2012-6-10 16:02:56 | 显示全部楼层
强烈支持,楼主万岁!
悠哉网www.sadnook.com
中国讲座在线www.douya5.cn
尚生活www.027up.com
悠哉教育www.yoozai.com
虚拟主机www.whdata.net
要爱你www.1l0.cn












悠哉网www.sadnook.com
中国讲座在线www.douya5.cn
回复 支持 反对

使用道具 举报

发表于 2017-7-20 13:42:38 | 显示全部楼层
我也想了解,谢谢发帖的人











http://www.jinandaqian.com/  http://feijipiaojiagechaxun.com/    2017年07月20日 http://www.youwilltech.com/  http://chengrenshi.com/
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册 用百度帐号登录

本版积分规则

Archiver|手机版|小黑屋|BimCad Inc. ( 京ICP备15064117号

GMT+8, 2017-8-17 14:08 , Processed in 0.147556 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表