Я использую 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))
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... inish-befo
WPF C# — асинхронный запуск кода, позволяющий завершить каждый фрагмент кода до запуска следующего ⇐ C#
Место общения программистов C#
1728625600
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 для анимации, что частично работает,
но обе анимации происходят одновременно, и код расчета
тоже).
[b]ОБНОВЛЕНИЕ[/b]
Я создал новый метод ниже и обновил несколько
моих методов, чтобы они стали асинхронными задачами... Кажется, это работающий. Новый метод вызывает каждую задачу с помощью 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))
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79076324/wpf-c-sharp-run-code-asynchronously-allowing-each-chunk-of-code-to-finish-befo[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия