2013-04-15 2 views
-1

Я делаю игру SizzlingHot на WPF. У меня есть холст, в котором можно загрузить падающие изображения фруктов. Когда я нажимаю на startButton, он должен создать раскадровку с doubleAnimation для падающих фруктов. У меня есть следующий код в методе:Создать раскадровку и двойную аппроксимацию

NameScope.SetNameScope(this, new NameScope()); 

Cherry cherry = new Cherry(); // I get the image from this class 
// GameCanvas.Children.Add(cherry.FruitImage); // idk if this should be here and its invalid because the parameter in the parantheses shoud be UI element it does not allow BitmapImage      

DoubleAnimation myDoubleAnimation = new DoubleAnimation(100, 500, new Duration(TimeSpan.FromSeconds(5))); 
myDoubleAnimation.From = -150; 
myDoubleAnimation.To = 500;    

Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath("(Canvas.Top)")); 
Storyboard.SetTarget(myDoubleAnimation, cherry.FruitImage); 
Storyboard myStoryboard = new Storyboard();      

myStoryboard.Children.Add(myDoubleAnimation); 
GameCanvas.Resources.Add(myStoryboard,cherry.FruitImage); 

myStoryboard.Begin(this, true); 

Когда я запускаю это, на последней строке, это дает мне

InvalidOperationException - Операция не действует в связи с текущей стадии объекта ,

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

+0

Где именно вы добавляете элемент на холст? Вы должны анимировать содержащееся «Изображение», а не источник «BitmapImage». –

+0

Я добавляю его с Canvas.Children.Add (myImage), и это не источник, это мое изображение, но появляется ошибка. Невозможно преобразовать Bitmap в System.Windows.UIElement. Разве это не правильный метод добавления материала в холст? –

ответ

0

Попробуйте сделать это на изображении, если вы еще не:

image.BeginInit(); 
image.UriSource = new Uri(filename, UriKind.Relative); 
image.EndInit(); 
cherryImage.Source = image; 
+0

ОК InvalidOperationException не отображается, но на экране ничего не появляется. –

+0

Обратите внимание, что это может быть написано намного короче: 'cherryImage.Source = new BitmapImage (новый Uri (имя файла, UriKind.Relative));'. Нет необходимости в BeginInit/EndInit, когда вы просто хотите создать BitmapImage из Uri. – Clemens

0

В случае cherry.FruitImage является Image, вы могли бы просто оживить его так:

cherry.FruitImage.BeginAnimation(
    Canvas.TopProperty, 
    new DoubleAnimation(-150, 500, TimeSpan.FromSeconds(5))); 

Нет необходимости для Раскадровка.

1

Вы можете добавить только UIElement в Canvas, добавив BitmapImage непосредственно в Canvas не получится.

Одним из вариантов может быть, чтобы добавить динамический Image и установить Source к вашему FruitImage, то вы можете анимировать/позиционировать Image на вашем GameCanvas

Пример:

Cherry cherry = new Cherry(); 

// Create host for BitmapImage 
Image imageHost = new Image { Source = cherry.FruitImage }; 
GameCanvas.Children.Add(imageHost); 

// Animate Image 
imageHost.BeginAnimation(Canvas.TopProperty, new DoubleAnimation(-150, 500, new Duration(TimeSpan.FromSeconds(5)))); 
+0

Я понимаю, теперь это очень помогло. –

+0

@DimitarAndreev, пожалуйста, отметьте ответ как правильный, если он ответит на ваш вопрос – Codeman

Смежные вопросы