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

    第二种方法,CompositionTarget动画,官方描述为:CompositionTarget对象可以根据每个帧回调来创建自定义动画。其实直接点,CompositionTarget创建的动画是基于每次界面刷新后触发的,与窗体刷新率保持一致,所以频率是固定的,很难人工介入控制。

    那么如何使用它?xaml的界面代码还是和上一篇中描述的一样,这里不累述了。那么接下来就是创建对象并注册事件,全部代码如下: 

        Rectangle rect; //创建一个方块作为演示对象

        double speed = 1; //设置移动速度

        Point moveTo; //设置移动目标

        public Window1() {

            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);

            //注册界面刷新事件

            CompositionTarget.Rendering += new EventHandler(Timer_Tick);

        }

 

        private void Carrier_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {

            moveTo = e.GetPosition(Carrier);

        }

        CompositionTarget的注册事件方法为:

        CompositionTarget.Rendering += new EventHandler(Timer_Tick);

    因为我们要实现的是鼠标点哪方块就移动到哪,所以我用一个变量moveTo保存鼠标点击点的Point。并在鼠标左键事件中赋值:moveTo = e.GetPosition(Carrier);同时设置方块XY方向的速度均为speed

    接下来就是实现Timer_Tick了,它是基于窗体的时时刷新事件。我们这样写:

        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));

        }

    首先获取方块的XY位置,接下让方块的XYmoveToXY进行比较而判断是+speed还是-speed,这里的逻辑需要朋友们自行领会了。

    好了Ctrl+F5测试一下,呵呵,是不是同样也动起来了呢?

    可是大家会发现一个很大的问题:这方块移动得也太勉强了吧,抖来抖去的而且移动得也不平滑,是不是CompositionTarget有问题?其实不然,因为之前的Storyboard动画它不存在XY轴的速度,只需要设定起点和终点以及过程经历的时间就可以平滑的移动了,而CompositionTarget需要分别设定XY轴的速度,而我们这为了简单演示,XY轴的速度speed均设置成了5,这在现实使用中是绝对不合理的。因此,如果要模拟实际效果,必须计算终点和起点的正切值Tan,然后再根据直线速度speed通过Tan值计算出speed_X,speed_Y,最后改写成:      

        Canvas.SetLeft(rect, rect_X + (rect_X < moveTo.X ? speed_X : -speed_X));

        Canvas.SetTop(rect, rect_Y + (rect_Y < moveTo.Y ? speed_Y : -speed_Y));

    这样才能实现真实的移动(具体算法就不讨论了)

    这一节讲解了如何使用CompositionTarget主界面刷新线程实现基于帧的动画,下一节我将讲解第三种动态创建动画的方法,并会对这三种方法进行一个归纳比较。

作者:深蓝色右手
教程目录及源码下载: 点击进入
本文版权归作者和CSDN共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial)目录 本系列教程目录如下: C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(一)让物体起来C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):()让物体起来 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(三)让物体起来C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(四)实现2D人物动画C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(五)实现2D人物动画 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(六)完美移 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(七)传说中的A*寻径算法 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(八)完美实现A*寻径动画 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(九)2D游戏角色在地图上的移 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十)斜度α地图的构造及算法 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十一)地图遮罩层的实现 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十)神奇的副本地图 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十三)牵引式地图移模式① C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十四)精灵控件横空出世!① C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十五)精灵控件横空出世! C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十六)牵引式地图移模式 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十七)完美精灵之八面玲珑(WPF Only)① C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十八)完美精灵之八面玲珑(WPF Only) C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十九)完美精灵之八面玲珑(WPF Only)③ C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十)第一部分拓展小结篇 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十一)主位式地图移模式 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):()重构 - 让代码插上翅膀飞翔 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十三)自适应性窗口化与全屏化 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十四)Be careful!前方怪物出没 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十五)完美捕获精灵之神器 -- HitTest C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十六)通用型角色头像面板 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十七)战斗前夜之构建态障碍物系统 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十八)经典式属性设计及完美的物理攻击系统 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(十九)人工智能(AI)之追踪者 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(三十)大法师 - 华丽经典之轮回 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(三十一) 超酷万变的矢量魔法 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(三十) 雷、混、冰、毒、火、风 - 幻化中的魔法魅力! C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(三十三) 锦上添花之魔法特效装饰 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(三十四) 地图编辑器诞生啦! C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(三十五) 地图编辑器的初步使用 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(三十六) 地图自定义切片与导出 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(三十七) 地图自适应区域加载 C#开发WPF/Silverlight动画游戏系列教程(Game Tutorial):(三十八) 地图间的传送与切换 摘自博客园深蓝色右手文章(原文链接:http://www.cnblogs.com/alamiye010/archive/2009/06/17/1505346.html) 压缩包内的2个文件,chm和exe格式内容一样

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值