经过前面的介绍和学习,我们分别掌握了如何点击鼠标让对象移动,并且实现2D人物的动作动画。那么,如何将两者完美的进行融合呢?这一节的内容将涉及到很多重要的技术及技巧,很关键哦。

那么同样的,前台xaml还是保持不变,接下来看后台C#第一部分:

int count = 0;

Image Spirit;

Storyboard storyboard;

public Window6() {

InitializeComponent();

Spirit = new Image();

Spirit.Width = 150;

Spirit.Height = 150;

Carrier.Children.Add(Spirit);

Canvas.SetLeft(Spirit, 0);

Canvas.SetTop(Spirit, 0);

DispatcherTimer dispatcherTimer = new DispatcherTimer();

dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);

dispatcherTimer.Interval = TimeSpan.FromMilliseconds(150);

dispatcherTimer.Start();

}

private void dispatcherTimer_Tick(object sender, EventArgs e) {

Spirit.Source = new BitmapImage((new Uri(@"Player\" + count + ".png", UriKind.Relative)));

count = count == 7 ? 0 : count + 1;

}

上面代码基本上相对于前面几节没有太多改变,只是结合了第一节和第四节的内容。

那么再看C#第二部分:

private void Carrier_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {

Point p = e.GetPosition(Carrier);

Move(p);

}

private void Move(Point p) {

//创建移动动画

storyboard = new Storyboard();

//创建X轴方向动画

DoubleAnimation doubleAnimation = new DoubleAnimation(

Canvas.GetLeft(Spirit),

p.X,

new Duration(TimeSpan.FromSeconds(1))

);

Storyboard.SetTarget(doubleAnimation, Spirit);

Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Canvas.Left)"));

storyboard.Children.Add(doubleAnimation);

//创建Y轴方向动画

doubleAnimation = new DoubleAnimation(

Canvas.GetTop(Spirit),

p.Y,

new Duration(TimeSpan.FromSeconds(1))

);

Storyboard.SetTarget(doubleAnimation, Spirit);

Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Canvas.Top)"));

storyboard.Children.Add(doubleAnimation);

//将动画动态加载进资源内

if (!Resources.Contains("rectAnimation")) {

Resources.Add("rectAnimation", storyboard);

}

//动画播放

storyboard.Begin();

}

不难看出鼠标左键点击事件中Move()方法,该方法大家如果熟悉第一节的话将非常好理解,通过将这两段代码进行合成,即可以实现鼠标点哪主角就向哪移动,同时主角的动画始终保持为跑步状态。

那么该动画并非完美,存在以下3个问题:

一、主角始终为跑步状态,那么能否当主角移动到目的地后即变成站立状态呢?

of course,方法不要太多,这里我给大家一个小提示,例如我们可以dispatcherTimer_Tick事件中进行如下判断:

if (storyboard != null && storyboard.GetCurrentTime() == TimeSpan.FromSeconds(1)) {

TODO...

//主角的图片源切换成站立系列帧图片即可。

}

当然此方法只是N多方法之一。

二、主角定位的坐标始终处于图片的左上角,能否定位到主角的脚底,例如我鼠标点哪,主角移动到该处后脚的位置站在此点上,实现精确定位?

这其实并不难,涉及到一个图片定位算法问题,您需要设置一个Point Spirit_Position{get;set}属性来存储主角的坐标。并且该坐标的Spirit_Position.X,Spirit_Position.Y值分别定位到主角的脚底,如下图:

然后在以后的调用中都使用该坐标来取代Canvas.getLeft(),Canvas.getTop()。

三、主角朝向如何实现8个方向,即往哪边跑就朝向哪边?

这就是典型的算法问题了,其实也很简单,根据主角移动的目标Target.X和Target.Y分别与主角初始位置的Old.X和Old.Y进行一个角度计算,然后根据判断返回0-7(int),8个数字分别代表8个朝向,这样在Spirit.Source设置时就调用相应角度的图片源系列帧即可。

到此,我们已经能够完美的实现角色的移动与停止等动画,接下来的章节我将就地图结构与主角在地图中的处理进行详细讲解,敬请关注。

作者:深蓝色右手
出处:http://alamiye010.cnblogs.com
教程目录及源码下载:点击进入(欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(六)完美移动相关推荐

  1. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):目录

    本系列教程的示例代码下载(感谢 银光中国 提供资源分流): 第一部分源码:WPFGameTutorial_PartI(1-20节) 第二部分源码:WPFGameTutorial_PartII(21-2 ...

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

    第二种方法,CompositionTarget动画,官方描述为:CompositionTarget对象可以根据每个帧回调来创建自定义动画.其实直接点,CompositionTarget创建的动画是基于 ...

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

    序:自从QXGame(WPF GAME ENGINE)游戏引擎公布以来,受到很多朋友的热切关注,于是乎有了写教程的想法.那么从今天开始,我将带领大家一步一步的学会如何使用纯C#开发WPF/Silver ...

  4. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十八) 完美精灵之八面玲珑(WPF Only)②...

    紧接着上一节,首先得解释一下为什么需要将这272张图片合成为一张大图.因为如果游戏中还有装备.坐骑等其他设置,那么我们就需要对图片源进行时时的合成:同时对272张甚至更多的图片进行合成效率高还是对2张 ...

  5. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十五)完美捕捉精灵之神器 -- HitTest...

    怪物们都出现了,如何选中自己心仪的怪是主角目前首要做的事. 为了进行鼠标状态区别,我首先对鼠标变化规则进行约束:当鼠标在屏幕上空旷地图区域移动时,鼠标光标形态表现为默认光标 (0号光标图片),当鼠标经 ...

  6. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四)实现2D人物动画①

    通过前面的学习,我们掌握了如何动态创建物体移动动画,那么接下来我将介绍WPF中如何将物体换成2D游戏角色,并通过使用前面所讲的DispatcherTimer计时器来实现2D人物角色的各种动作动画. 动 ...

  7. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十九) 落雷!治疗!陷阱!连锁闪电!多段群伤!魔法之终极五重奏②...

    本节,我将完成本教程示例游戏的最终两个魔法:传说中的连锁闪电与暴风雪.如此经典与华丽的家伙无论在哪款好游戏中都少不了它们的踪影. 首先是连锁闪电,在<英雄无敌>中体现得尤为出色,击中一个怪 ...

  8. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十六)通用型角色头像面板...

    目前游戏的开发进度已经基本实现了精灵对象之间的普通交互,接下来我们需要朝着实现战斗系统的目标前行.而实现它的前提是必须完善精灵控件的基本属性,如添加生命值.魔法值.活力值.经验值等基本属性并通过窗体界 ...

  9. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十七)远距离单体攻击与单体魔法...

    到目前为止,主角能使用的魔法均为群攻型魔法,群攻魔法的原理相对简单,常见如圆形范围,矩形范围,扇形范围等等,当魔法释放后可以按照本教程的做法对所有坐标处于相应范围内的怪物进行伤害处理,这是直观的处理方 ...

  10. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十)斜度α地图的构造及算法...

    在当前的网络游戏中,地图基本都是采取一定斜度的拼装地图,这其中存在两种斜度地图的构造方式: 第一种我称之为伪斜度地图:该类型地图表现层图片为斜度的,但地图基底障碍物等的构造则实为正方形,如下图: 其实 ...

最新文章

  1. 限时删!一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)
  2. android 添加日程失败,Andriod向系统日历添加日程
  3. 神经网络调参---权重对分类性能的影响
  4. signature=01a8bb5f15835faa2985256d36b2fe94,Point of Maintenance
  5. java web代码混淆_JAVA WEB 项目的代码混淆
  6. iweboffice之word——自定义菜单的使用
  7. SEO中一些黑帽作弊方法介绍
  8. 网页实现数据离线永久保存localStorage、storage
  9. 搭建 Asp.net 云服务器
  10. Dissect RB-Tree
  11. js判断APP和浏览器
  12. 从零开始Android游戏编程(第二版) 前言
  13. 京瓷1800打印机扫描步骤_京瓷1800操作指南
  14. 原生代码加载网络图片和Volley和Picasso的简单介绍和优缺点对比
  15. JSP实现在线投票系统
  16. linux服务器套件,TheSSS 23.1维护更新,轻量级服务器套件
  17. ca 手机抓包_手机抓包教程第一节(草稿)
  18. 我的QQ微博 和新浪微博地址
  19. 【CC评网】2013.第39周 漂亮的作息表
  20. 不容错过 家具模型3d模型素材推荐

热门文章

  1. 中班区域活动设计思路_【年段教研】“小游戏大学问 巧建构促发展” ——石狮实幼中班段年段教研主题建构游戏的组织与开展...
  2. word无法打开请去应用商店_word文档打不开的4种解决方法
  3. cmd c语言 文件,DSP,如何编写CMD文件!(转)
  4. hough变换检测圆周_hough变换原理以及实现(转载)
  5. html5基础知识点文本标签
  6. Vue3.js 全局组价案例入门
  7. Struts2 表单和非表单标签
  8. python3安装过程中出现的ssl问题,No module named _ssl或者renaming “_ssl“ since importing it failed
  9. 西瓜书学习记录-线性模型(第三章)
  10. OpenCV+python实现视频文件读写