WEB开发网
开发学院软件开发C语言 C#开发WPF/Silverlight动画及游戏系列教程(Game C... 阅读

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

 2009-06-29 07:07:44 来源:WEB开发网   
核心提示: 充实了精灵动画原理后,我们再重新回到本节的主题上:如何使精灵在移动的时候表现出正确的朝向以及精确的定位与停止,C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十九) 完美精灵之八面玲珑(WPF Only)③(2), 大家是否还记得我在第六节结尾的地方

充实了精灵动画原理后,我们再重新回到本节的主题上:如何使精灵在移动的时候表现出正确的朝向以及精确的定位与停止。

大家是否还记得我在第六节结尾的地方略有提到相关的实现方法,但是并未对之进行实现,也算留给大家的一个小思考吧。但是本节我既然起了完美精灵这个题目,就不打算辜负所有朋友们的期待,我们首先分析实现8方向精灵的步骤:

1、获取主角当前的坐标,这在第十五节中已经完美实现了,而且同样是定位到脚底的(Spirit.X,Spirit.Y)。

2、获取目标坐标,即鼠标左键(或右键)点击的点的坐标,该坐标我们可以通过鼠标左键(或右键)点击事件轻松得到,这在前面的章节里有大量的提及。

3、以以上两个坐标为参数,通过正切值计算公式计算出主角当前的朝向并返回一个数字代号(0-7分别对应8个方向)

具体如何操作,且看下图:

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

  图片看不清楚?请点击这里查看原图(大图)。

原理在上图右半部分的注释中描述很清楚;我依据此原理写了个通用判断朝向的方法,精华哦:

        /// <summary>
        /// 通过正切值获取精灵的朝向代号
        /// </summary>
        /// <param name="targetX">目标点的X值</param>
        /// <param name="targetY">目标点的Y值</param>
        /// <param name="currentX">当前点的X值</param>
        /// <param name="currentY">当前点的Y值</param>
        /// <returns>精灵朝向代号(以北为0顺时针依次1,2,3,4,5,6,7)</returns>
        public static double GetDirectionByTan(double targetX, double targetY, double currentX, double currentY) {
            double tan = (targetY - currentY) / (targetX - currentX);
            if (Math.Abs(tan) >= Math.Tan(Math.PI * 3 / 8) && targetY <= currentY) {
                return 0;
            } else if (Math.Abs(tan) > Math.Tan(Math.PI / 8) && Math.Abs(tan) < Math.Tan(Math.PI * 3 / 8) && targetX > currentX && targetY < currentY) {
                return 1;
            } else if (Math.Abs(tan) <= Math.Tan(Math.PI / 8) && targetX >= currentX) {
                return 2;
            } else if (Math.Abs(tan) > Math.Tan(Math.PI / 8) && Math.Abs(tan) < Math.Tan(Math.PI * 3 / 8) && targetX > currentX && targetY > currentY) {
                return 3;
            } else if (Math.Abs(tan) >= Math.Tan(Math.PI * 3 / 8) && targetY >= currentY) {
                return 4;
            } else if (Math.Abs(tan) > Math.Tan(Math.PI / 8) && Math.Abs(tan) < Math.Tan(Math.PI * 3 / 8) && targetX < currentX && targetY > currentY) {
                return 5;
            } else if (Math.Abs(tan) <= Math.Tan(Math.PI / 8) && targetX <= currentX) {
                return 6;
            } else if (Math.Abs(tan) > Math.Tan(Math.PI / 8) && Math.Abs(tan) < Math.Tan(Math.PI * 3 / 8) && targetX < currentX && targetY < currentY) {
                return 7;
            } else {
                return 0;
            }
        }

上一页  1 2 3 4  下一页

Tags:开发 WPF Silverlight

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接