WPF вызывает разные раскадровки для одной и той же цели несколько раз - PullRequest
0 голосов
/ 11 мая 2019

Создание карточной игры, и когда игра начинается, на карту раздаются 5 карт. При использовании раскадровки карта переходит из колоды в позицию 0-4 соответственно. Существует 5 историй, по одной на каждые 5 позиций.

История вызывается из цикла for, который:

  • получить новую карту из колоды.
  • Запустите соответствующую историю.
  • Показать новую карту (настоящую, а не ту, которая идет из колоды).
  • Сброс карты, исходящей из колоды, в исходное положение.

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

<Page.Resources>

    <Storyboard x:Name="sDeckToHandPositionOne" TargetName="HandPositionOne"> 
        <DoubleAnimation Storyboard.TargetProperty="(Image.RenderTransform).(TranslateTransform.X)" To="0" Duration="0:0:1"/>
        <DoubleAnimation Storyboard.TargetProperty="(Image.RenderTransform).(TranslateTransform.Y)" To="0" Duration="0:0:1"/>
    </Storyboard>

    <Storyboard x:Name="sDeckToHandOne" TargetName="HandPositionOne"> 
        <DoubleAnimation Storyboard.TargetProperty="(Image.RenderTransform).(TranslateTransform.X)" To="0" Duration="0:0:1"/>
        <DoubleAnimation Storyboard.TargetProperty="(Image.RenderTransform).(TranslateTransform.Y)" To="0" Duration="0:0:1"/>
    </Storyboard>

</Page.Resources>
RunDeckToHandStory(string target) {

    string myStory = "sDeckToHandPositionOne";
    Storyboard story = (Storyboard)UI.Ctrl.Resources[myStory] as Storyboard;
    var moveX = (DoubleAnimation)story.Children[0];
    var moveY = (DoubleAnimation)story.Children[1];
    moveX.To = ImgHandCoordinates[Position][target] - ImgHandCoordinates[DeckOfCards][0];
    moveY.To = ImgHandCoordinates[Position][target] - ImgHandCoordinates[DeckOfCards][1];
    story.Begin();

}

For (i=0; i<5; i++) {

    int targetHandPosition = i;
    newCard = GetNewCardFromDeck();
    RunDeckToHandStory(targetHandPosition);
    DisplayNewCard(targetHandPosition, newCard);
    ResetDeckCardPosition();

}

примечание: это пример, он может содержать опечатку.

1 Ответ

1 голос
/ 13 мая 2019

Если я правильно понимаю вашу проблему, вы пытаетесь запустить коллекцию Storyboard последовательно , то есть следующая раскадровка должна ждать завершения текущей раскадровки;однако ваш код воспроизводит коллекцию Storyboard параллельно, и в результате получается, что проигрывается только последний Storyboard, остальные просто игнорируются.

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

var storyboardQueue = new Queue<Storyboard>();
storyboardQueue.Enqueue((Resources["sDeckToHandPositionOne"] as Storyboard));
storyboardQueue.Enqueue((Resources["sResetPosition"] as Storyboard)); 
storyboardQueue.Enqueue((Resources["sDeckToHandPositionTwo"] as Storyboard));
storyboardQueue.Enqueue((Resources["sResetPosition"] as Storyboard));
storyboardQueue.Enqueue((Resources["sDeckToHandPositionThree"] as Storyboard));
storyboardQueue.Enqueue((Resources["sResetPosition"] as Storyboard));
//... other storyboards

PlayNextStoryBoard(storyboardQueue);

private void PlayNextStoryBoard(Queue<Storyboard> storyboardQueue)
{
    if (storyboardQueue.Count > 0)
    {
        var sb = storyboardQueue.Dequeue();
        sb.Completed += (o, e) =>
        {
            PlayNextStoryBoard(storyboardQueue);
        };
        sb.Begin();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...