Специальное изображение Silverlight, смещающееся вправо - PullRequest
1 голос
/ 15 мая 2009

Я генерирую набор изображений, чтобы сформировать человеческое тело, чтобы я мог использовать его для физического движка. Сгенерированные изображения находятся в определенном пользовательском элементе управления, в котором я устанавливаю размеры и координаты каждого изображения. Этот пользовательский элемент управления затем загружается в другой пользовательский элемент управления, но по какой-то причине при загрузке изображений одно конкретное изображение, которое я назвал (rightBicep), смещается вправо. Вот скриншот:

альтернативный текст http://img193.imageshack.us/img193/592/imageshift.jpg

Я проиллюстрировал положение изображений пунктирными линиями, зеленая пунктирная линия указывает на то место, где должно быть расположено изображение, а красная пунктирная линия - это то место, где изображение показывается.

Странная вещь - изображение под ним (называемое rightForearm) берет его LeftPosition из него, и когда во время отладки они имеют точно такое же значение leftProperty. Вот синтаксис:

        public void generateRightBicep(string imageUrl)
        {
            rightBicep = new Image();            
            rightBicep.Name = CharacterName + "rightbicep";
            Uri imageUri = new Uri(imageUrl, UriKind.Relative);
            LayoutRoot.Children.Add(rightBicep);

            rightBicep.Source = new BitmapImage(imageUri);
            rightBicep.ImageOpened += new EventHandler<RoutedEventArgs>(bodyPart_ImageOpened);

        }

       public void rightBicepLoaded()
        {
            var bi = waitTillImageLoad(rightBicep.Name);
            rightBicep.Height = elbowToArmpit + (2 * palm);
            rightBicep.Width = ratio(bi.PixelHeight, bi.PixelHeight, rightBicep.Height); // to be determined

            Vector2 topVector;
            topVector.X = (float)(Convert.ToDouble(torso.GetValue(Canvas.LeftProperty)) - palm);
            topVector.Y = (float)(Convert.ToDouble(neck.GetValue(Canvas.TopProperty)) + neck.Height);

            if (!faceRight)
            {
                perspectiveVectorHeight(ref topVector, ref rightBicep, torso.Width);
                rightBicep.Width = ratio(bi.PixelHeight, bi.PixelHeight, rightBicep.Height);
            }

            rightBicep.SetValue(Canvas.LeftProperty, Convert.ToDouble(topVector.X));
            rightBicep.SetValue(Canvas.TopProperty, Convert.ToDouble(topVector.Y));
            rightBicep.SetValue(Canvas.ZIndexProperty, rightBicepZindex);
            generateRightShoulder();
        }


public void generateRightForearm(string imageUrl)
        {
            rightForearm = new Image();
            rightForearm.Name = CharacterName + "rightforearm";
            Uri imageUri = new Uri(imageUrl, UriKind.Relative);
            LayoutRoot.Children.Add(rightForearm);
            rightForearm.Source = new BitmapImage(imageUri);
            rightForearm.ImageOpened += new EventHandler<RoutedEventArgs>(bodyPart_ImageOpened);

        }

 public void rightForearmLoaded()
        {
            var bi = waitTillImageLoad(rightForearm.Name);
            rightForearm.Height = (elbowToHandTip - handLength) + palm;
            rightForearm.Width = ratio(bi.PixelHeight, bi.PixelWidth, rightForearm.Height);

            Vector2 topVector;
            if (faceRight)
            {
                topVector.X = (float)(Convert.ToDouble(rightBicep.GetValue(Canvas.LeftProperty)));
                topVector.Y = (float)(Convert.ToDouble(rightBicep.GetValue(Canvas.TopProperty)) + rightBicep.Height - palm);
            }
            else
            {
                topVector.X = (float)(Convert.ToDouble(leftBicep.GetValue(Canvas.LeftProperty)));
                topVector.Y = (float)(Convert.ToDouble(leftBicep.GetValue(Canvas.TopProperty)) + leftBicep.Height - palm);

                perspectiveVectorHeight(ref topVector, ref rightForearm, torso.Width);
                rightForearm.Width = ratio(bi.PixelHeight, bi.PixelWidth, rightForearm.Height);
            }

            rightForearm.SetValue(Canvas.LeftProperty, Convert.ToDouble(topVector.X));
            rightForearm.SetValue(Canvas.TopProperty, Convert.ToDouble(topVector.Y));
            rightForearm.SetValue(Canvas.ZIndexProperty, rightForearmZIndex);
            generateRightElbow();
        }

Теперь все значения, которые я складываю вместе, представляют собой группу двойных значений, которые я предварительно установил, и свойство faceRight должно определять, направлено ли тело человека вправо или влево, чтобы определить, где расположены части тела (так как если смотрит на левую сторону, когда тело человека поворачивается в другую сторону).

Если вы заметили, что правое предплечье принимает левое свойство правого бицепса, так что технически оно должно отображаться прямо под ним, а это не так. Я также отладил пользовательский элемент управления, и оба имеют свойство left -3.

PS. Я вызываю методы rightbicepLoaded и rightforearmLoaded, когда вызывается событие, когда все события imageOpened были запущены.

Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 16 мая 2009

Выяснил, почему, в моем методе соотношения это должно принимать высоту и ширину, и я положил, и вместо этого я поставил 2 hieghts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...