WPF - Storyboard événement terminé
Je suis de la conception d'un jeu de ce type
class Anima
{
Storyboard story;
Random rand;
Canvas canvas;
Ellipse target;
public Anima() {
rand = new Random();
canvas = new Canvas();
target = new Ellipse();
target.Fill = Brushes.Red;
target.Width = 50;
target.Height = 50;
Canvas.SetLeft(target, rand.NextDouble() * 300);
Canvas.SetTop(target, rand.NextDouble() * 300);
canvas.Children.Add(target);
story = new Storyboard();
story.BeginTime = TimeSpan.FromMilliseconds(rand.Next(500, 5000));
DoubleAnimation a = new DoubleAnimation();
a.To = rand.NextDouble() * 300;
a.Duration = new Duration(TimeSpan.FromMilliseconds(50));
Storyboard.SetTarget(a, target);
Storyboard.SetTargetProperty(a, new PropertyPath(Canvas.LeftProperty));
story.Children.Add(a);
DoubleAnimation b = new DoubleAnimation();
b.To = rand.NextDouble() * 300;
b.Duration = new Duration(TimeSpan.FromMilliseconds(50));
Storyboard.SetTarget(b, target);
Storyboard.SetTargetProperty(b, new PropertyPath(Canvas.TopProperty));
story.Children.Add(b);
story.Completed += new EventHandler(story_Completed);
Window win = new Window();
win.Loaded += delegate(object sender, RoutedEventArgs e) {
story.Begin();
};
win.Content = canvas;
win.Show();
}
void story_Completed(object sender, EventArgs e) {
int next = rand.Next(500, 5000);
double left = rand.NextDouble() * 300;
double top = rand.NextDouble() * 300;
Console.WriteLine("position: ({0:G6}, {1:G6})", Canvas.GetLeft(target), Canvas.GetTop(target));
Console.WriteLine("state : wait for " + next + " ms");
Console.WriteLine("next : ({0:G6}, {1:G6})", left, top);
Console.WriteLine();
(story.Children[0] as DoubleAnimation).To = left;
(story.Children[1] as DoubleAnimation).To = top;
story.BeginTime = TimeSpan.FromMilliseconds(next);
story.Begin();
}
}
Tout est parfait, mais j'ai trouvé que l'ellipse n'a pas la bonne position et de faire une erreur d'environ 2% à 50%. Il semble que la table de montage séquentiel.Terminé événement déclenché avant la fin de l'animation.
Quel est le problème avec elle?
Vous devez vous connecter pour publier un commentaire.
Je suggère que vous utilisez CompositionTarget.Le rendu de l'événement ou de la Minuterie pour contrôler des animations complexes, surtout si vous êtes en train de développer un jeu. Les animations intégrées ne sont pas suffisamment précis et ne peut être contrôlée facilement.
Voici quelques liens qui pourront vous aider à démarrer sur CompositionTarget
Comment: de Rendu Par Image Intervalle à l'Aide de CompositionTarget
À l'aide de la CompositionTarget
Le plaisir de l'Animation de la Partie 1
utilisation
Dispatcher.BeginInvoke(...)
, vous pouvez obtenir la bonne valeur