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

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

 2010-09-30 20:48:15 来源:WEB开发网   
核心提示: List<QXSpirit> SpiritList = new List<QXSpirit>();接下来定义HitTest的过滤器HitFilter,用于筛选HitTest捕获的对象,C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二

List<QXSpirit> SpiritList = new List<QXSpirit>();

接下来定义HitTest的过滤器HitFilter,用于筛选HitTest捕获的对象,我们只需要捕获QXSpirit类型对象即可,然后将之添加进精灵容器:

        public HitTestFilterBehavior HitFilter(DependencyObject dObject) {

            if (dObject is QXSpirit) {

                SpiritList.Add(dObject as QXSpirit);

            }

            return HitTestFilterBehavior.Continue;

        }

每执行一次过滤器后,我们必须重复以上过程继续向更深层次进行捕获,因此在HitTest结果HitResult中执行继续操作以供向下个节点轮循:

        public HitTestResultBehavior HitResult(HitTestResult result) {

            return HitTestResultBehavior.Continue;

        }

HitFilter和HitResult是HitTest中控制流程非常重要的参数,定义完它两后接下来我们在窗体的鼠标移动事件中进行如下HitTest命中测试:

        private void Window_MouseMove(object sender, MouseEventArgs e) {

            SpiritList.Clear();

            Point p = e.GetPosition(Carrier);

            VisualTreeHelper.HitTest(

            Carrier,

            new HitTestFilterCallback(HitFilter),

            new HitTestResultCallback(HitResult),

            new PointHitTestParameters(p));

            if (SpiritList.Count > 0) {

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

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

                        this.Cursor = Super.getCursor(1);

                        label3.Content = SpiritList[i].Name; //调试用

                        break;

                 } else {

                        this.Cursor = Super.getCursor(0);

                 }

               }

            }

        }

上一页  2 3 4 5 6 7 8 9  下一页

Tags:开发 WPF Silverlight

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