Запускайте код асинхронно, позволяя каждому фрагменту кода завершиться до начала следующего [закрыто]C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Запускайте код асинхронно, позволяя каждому фрагменту кода завершиться до начала следующего [закрыто]

Сообщение Anonymous »

Я использую WPF C# для написания игры «Извини». При выборе
"7" автоматический игрок получит множество опций, основанных на
"перемещении 7" или "разделении хода". Попытка выполнить необходимые вычисления и показать анимацию на холсте. (Пример: игрок
выбирает карту «7» и автоматически использует раздельный
ход с двумя своими людьми. Кажется, что часть пользовательского интерфейса или движения выполняется
в одно и то же время для оба мужчины, а часть принятия решений
находится за кадром.
Проблема: анимация происходит одновременно, а расчеты
не заканчиваются за между пользовательским интерфейсом для хода одного человека и ходом следующего человека (они все движутся и бегут одновременно). Мне это
не нужно.

Код: Выделить всё

   for (int n = 0; n < 2; n++)
{
moveNo = (n == 0 ? cardNo1 : cardNo2);
splitChoice = (n == 0 ? choice : navNo);

SlideToProcess = (optList[splitChoice].Nav.Count > moveNo);
MovePlayerWherever(optList[splitChoice].Nav, optList[splitChoice].ManId);
UpdateNewLocation(optList, splitChoice);
if (SlideToProcess)
{
nThElement = GetTheNthElementOfTheNavList(optList[splitChoice].Nav, moveNo);
ProcessPerimeterSlide(nThElement, optList[splitChoice].ManId);
}

if (!LimitMsg)
{
CurrentStatus += string.Format("\nCard: '{0}' -- {1} ({2}) Moved '{3}' space(s)",
"SEVEN", GetPlayerColor(playerNo), optList[splitChoice].ManId, moveNo);
}
}
Я знаю, что это обсуждалось разными способами, но у меня до сих пор нет
работоспособного решения. Спасибо за помощь. (Я использую
некоторые await и async для анимации, что частично работает,
но обе анимации происходят одновременно, и код расчета
тоже).
ОБНОВЛЕНИЕ
Я создал новый метод ниже и обновил несколько
моих методов, чтобы они стали асинхронными задачами... Кажется, это работающий. Новый метод вызывает каждую задачу с помощью await. Вот
код нового метода:

Код: Выделить всё

public async void ProcessStandardNumbers(int cardNumber)
{
int playerNo = GAME.CurrentPlayer;  // 0 .. 3 (YELLOW, GREEN, RED, BLUE)
List optList;
List< AnimatePerMtg> navEnds;
bool autoPlay = AutoArray[playerNo];
int nThElement, moveValue;

moveValue = Math.Abs(GetCardMoveValue(cardNumber));
optList = BuildChoiceListWithAllPlayersMen(playerNo, moveValue);  // Has full SLIDE list...
ChoiceStringList = BuildNewChoiceStringList(optList);
if (ChoiceStringList.Count > 0)
{
if (autoPlay)
{
navEnds = BuildNavListEnds(optList);
await Automatic_NavChoice(playerNo, navEnds);
if (ChoiceId == FORFEIT_MOVE)
{
DoForfeitMessage(GetCardName(cardNumber));
return;
}
}
else
PlayerDecision(ChoiceStringList.Count);

// let 'UpdateNewLocation' know, the slide will perform the update...
SlideToProcess = (optList[ChoiceId].Nav.Count > moveValue);
await MovePlayerWherever(optList[ChoiceId].Nav, optList[ChoiceId].ManId);
await UpdateNewLocation(optList, ChoiceId);   // Updates last location on slide, then removes
if (SlideToProcess)
{
nThElement = GetTheNthElementOfTheNavList(optList[ChoiceId].Nav, moveValue);
await ProcessPerimeterSlide(nThElement, optList[ChoiceId].ManId);
}
}
else
DoForfeitMessage(GetCardName(cardNumber))
}
----------------------- ОБНОВЛЕНИЕ ------- --------------------------------
Спасибо... Сообщество, вот ОТВЕТ на мой вопрос
и перефразирование реальной проблемы...
"Почему одновременно происходят две анимации..."
< ul>
[*]Надеюсь, я смогу лучше понять эту тему, она
никогда не была мне ясна, когда я пытался использовать ее в коде.

Вот парная версия моего кода, которая «РАБОТАЕТ». Я
все еще пытаюсь полностью понять, как «async-await» контролирует
поток данных. Очевидно, здесь многого не хватает, но
уберите «async» и «await», и вот что я увидел.
ОШИБКА: (Настольная игра Digital Извините).
Сценарий здесь таков: когда игрок движется таким образом, что
приземляется на занятое противником пространство, игрок противника
отправляется обратно в свою СТАРТ-позицию.
/>
  • Ошибка: И движущийся игрок, и противник, отправляемый
    обратно на СТАРТ, «анимируются» (одновременно), - В другомсловами, противник, кажется, возвращается к своему СТАРТу прежде, чем
    игрок переместит количество мест на карте.

    Код: Выделить всё

      public async void ProcessStandardNumbersAsync(int cardNumber)
    {
    moveValue = Math.Abs(GetCardMoveValue(cardNumber));
    optList = BuildChoiceListWithAllPlayersMen(playerNo, moveValue);
    ChoiceStringList = BuildNewChoiceStringList(optList);
    if (ChoiceStringList.Count > 0)
    {
    PlayerDecision(ChoiceStringList.Count);
    
    SlideToProcess = (optList[ChoiceId].Nav.Count > moveValue);
    await MovePlayerWherever(optList[ChoiceId].Nav, optList[ChoiceId].ManId);
    await UpdateNewLocation(optList, ChoiceId);
    if (SlideToProcess)
    {
    nThElement = GetTheNthElementOfTheNavList(optList[ChoiceId].Nav, moveValue);
    await ProcessPerimeterSlide(nThElement, optList[ChoiceId].ManId);
    }
    }
    }
    
----- Информация о коде -----
  • cardNumber – вытянутая карта, а не конкретное число для перемещения.
  • moveValue – количество мест, на которые игрок может переместить
  • optList — список возможных допустимых ходов.
  • optList[ChoiceId].Nav — путь навигации, выбранный для анимации.
  • SlideToProcess — логическое значение. общедоступная собственность
----- Важные методы -----
  • BuildChoiceList... — создает действительный список ходов.
  • PlayerDecision — диалоговое окно, позволяющее «человечным» игрокам сделать выбор.
  • MovePlayerWherever — код, который на самом деле перемещает изображения игрока на холсте.
  • UpdateNewLocation — обновляет конечные координаты человека игрока.
  • ProcessPerimeterSlide — в случае наличия СЛАЙДА обновляет и перемещает противника. НАЧАТЬ


Подробнее здесь: https://stackoverflow.com/questions/790 ... he-next-st
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»