Я генерирую набор изображений, чтобы сформировать человеческое тело, чтобы я мог использовать его для физического движка.
Сгенерированные изображения находятся в определенном пользовательском элементе управления, в котором я устанавливаю размеры и координаты каждого изображения. Этот пользовательский элемент управления затем загружается в другой пользовательский элемент управления, но по какой-то причине при загрузке изображений одно конкретное изображение, которое я назвал (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 были запущены.
Есть идеи, почему это происходит?