Exemple #1
0
        //public float TouchDistance { get; }
        //public Pointable.Zone TouchZone { get; }

        public Pointable(Leap.Pointable pointable, Frame frame, Hand hand)
        {
            IsTraveled = false;

            this.Frame                 = frame;
            this.Hand                  = hand;
            this.Id                    = pointable.Id;
            this.IsFinger              = pointable.IsFinger;
            this.IsTool                = pointable.IsTool;
            this.IsValid               = pointable.IsValid;
            this.Length                = pointable.Length;
            this.Width                 = pointable.Width;
            this.TimeVisible           = pointable.TimeVisible;
            this.TipPosition           = new Vector(pointable.TipPosition);
            this.TipVelocity           = new Vector(pointable.TipVelocity);
            this.StabilizedTipPosition = new Vector(pointable.StabilizedTipPosition);
        }
        public static void Update(GameTime gameTime, Leap.Frame frame)
        {
            Leap.Pointable currentPointer = null;
            foreach (Leap.Hand hand in frame.Hands)
            {
                Vector3 furthest = new Vector3(0, 0, 1000);
                foreach (Leap.Pointable p in hand.Pointables)
                {
                    if (p.IsExtended)
                    {
                        Vector3 worldPos = Util.toWorldNoTransform(p.StabilizedTipPosition) - new Vector3(0, Main.handOffset, 0);
                        if (worldPos.Z < furthest.Z)
                        {
                            furthest       = worldPos;
                            currentPointer = p;
                        }
                    }
                }
                Vector3 screenPos = Main.main.GraphicsDevice.Viewport.Project(furthest, Main.main.handCamera.projection, Main.main.handCamera.view, Matrix.Identity);
                screenFingerPos = new Vector2((screenPos.X - Main.screenWidth / 2) * 2f + (Main.screenWidth / 2), screenPos.Y);
                if (screenFingerPos.Y > Main.screenHeight * .5f)
                {
                    screenFingerPos.Y += (screenFingerPos.Y - Main.screenHeight / 2) * 1.5f;
                }
            }

            int   w      = Main.screenWidth;
            int   h      = Main.screenHeight;
            Point finger = new Point((int)screenFingerPos.X, (int)screenFingerPos.Y);

            foreach (Screen screen in screens)
            {
                if (screen.visible)
                {
                    float sw = screen.Size.calc(w, h).X;
                    float sh = screen.Size.calc(w, h).Y;
                    foreach (UIElement e in screen.elements)
                    {
                        if (e is Button)
                        {
                            Button    btn = e as Button;
                            Rectangle r   = new Rectangle((int)btn.Position.calc(sw, sh).X, (int)btn.Position.calc(sw, sh).Y, (int)btn.Size.calc(sw, sh).X + (int)btn.selOffset.X + (int)btn.selOffset.X, (int)btn.Size.calc(sw, sh).Y);
                            if (r.Contains(finger))
                            {
                                btn.hover       = true;
                                btn.selOffset.X = MathHelper.Lerp(btn.selOffset.X, 50, .2f);
                                if (currentPointer != null)
                                {
                                    if (currentPointer.TipVelocity.x > 200 && finger.X > r.Right - 40)
                                    {
                                        if (btn.onClick != null)
                                        {
                                            btn.onClick.Invoke();
                                        }
                                    }
                                }
                            }
                            else
                            {
                                btn.hover       = false;
                                btn.selOffset.X = MathHelper.Lerp(btn.selOffset.X, 0, .2f);
                            }
                        }
                        else if (e is RadioList)
                        {
                            RadioList rl = e as RadioList;
                            for (int i = 0; i < rl.items.Count; i++)
                            {
                                RadioListElement item = rl.items[i];

                                int       yoffset = (int)(i * rl.Size.calc(sw, sh).Y + i * 5);
                                Rectangle r       = new Rectangle((int)rl.Position.calc(sw, sh).X, (int)rl.Position.calc(sw, sh).Y + yoffset, (int)rl.Size.calc(sw, sh).X, (int)rl.Size.calc(sw, sh).Y);
                                if (r.Contains(finger) && !item.disabled)
                                {
                                    item.hover  = true;
                                    item.offset = MathHelper.Lerp(item.offset, i == rl.selected ? 50 : 25, .2f);
                                    if (currentPointer != null)
                                    {
                                        if (currentPointer.TipVelocity.x > 150 && finger.X > r.Center.X)
                                        {
                                            rl.selected = i;
                                            if (item.onSelected != null)
                                            {
                                                item.onSelected.Invoke();
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    item.hover = false;
                                    if (i != rl.selected)
                                    {
                                        item.offset = MathHelper.Lerp(item.offset, 0, .2f);
                                    }
                                    else
                                    {
                                        item.offset = MathHelper.Lerp(item.offset, 50, .2f);
                                        if (item.disabled)
                                        {
                                            rl.selected = -1;
                                        }
                                    }
                                }
                                rl.items[i] = item;
                            }
                        }
                    }
                }
            }
        }