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

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

 2010-09-30 20:48:15 来源:WEB开发网   
核心提示: 具体意思就是在精灵身体图片不透明区域进行外发光:蓝色,5像素宽,C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十五)完美捕捉精灵之神器 -- HitTest(9),无噪音,完整透明度,下一节我将讲解精灵面板界面,以及精灵3大基本属性(生命、魔力、经验值)

具体意思就是在精灵身体图片不透明区域进行外发光:蓝色,5像素宽,无噪音,完整透明度。其运行效果如下图:

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

看到这张图的时候或许大家开始有些欣喜若狂了,但是我想告诉大家:此方法绝对的行不通,为什么?一方面此方法只能在WPF中使用,它的原理是时时动态查找图片不透明区域的边缘,然后对边缘路径进行发光滤镜处理;而另一方面由于它是对图片源不透明区域进行时时的边缘查找,将极大的占用游戏的界面线程资源,是极其不友好的表现方式。

因此,为了同时适应WPF/Silverlight,我使用第二种方法作为最终解决方案。这种方法实现起来简单多了,只需要在前面代码的基础上加进行如下更改:

        private void Window_MouseMove(object sender, MouseEventArgs e) {

            ……

            if (SpiritList.Count > 0) {

                bool targetIsFound = false;

                for (int i = 0; i < SpiritList.Count; i++) {

                if (!targetIsFound && isEfficaciousSection(SpiritList[i].EfficaciousSection, e.GetPosition(SpiritList[i]))) {

                        this.Cursor = Super.getCursor(1);

                        SpiritList[i].Opacity = 0.6;

                        targetIsFound = true;

                        label3.Content = SpiritList[i].Name;

                    } else {

                        if (!targetIsFound) { this.Cursor = Super.getCursor(0); }

                        SpiritList[i].Opacity = 1;

                    }

                }

            }

        }

在鼠标移动事件中仅仅增改6行代码即可以轻松的实现,运行效果如下:

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

到此为止即完美实现了对精灵的精确捕获。忽忽,是不是感觉向完整的游戏框架目标又迈出了一大步?

在此,我还想对那些极端的朋友说一下:由于目前暂时采用多线程结构,在单核CPU电脑以及Win2003以前的操作系统上运行时,怪物密集的地方会有些卡。但是这根本代表不了游戏引擎的最终性能,教程还有非常非常多的内容没有讲到,优化的技术还在后面呢,太多了就不一一罗列了,大家应该都明白本系列既然取名为教程,代表的就是一个由浅入深的过程,很多人连基础原理都没弄清楚,源码对你有何意义?

小结:HitTest功能强大到几乎无所不能,它是我们实现打怪与施放魔法的前提条件。下一节我将讲解精灵面板界面,以及精灵3大基本属性(生命、魔力、经验值)表现形式的实现方法,敬请关注。

出处:http://alamiye010.cnblogs.com/

上一页  4 5 6 7 8 9 

Tags:开发 WPF Silverlight

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