Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ожидание удовлетворительного пользовательского ввода (http://www.flasher.ru/forum/showthread.php?t=213083)

Wormhole 27.06.2016 21:50

Ожидание удовлетворительного пользовательского ввода
 
Здравствуйте.
Я реализую алгоритм по следующей схеме:

Код AS3:

while (Некоторое условие)
{
  делать то-то;
  ждать нажатия клавиши с цифрой, для которой будут выполнены условия;
  делать се-то;
}

Условия для клавиши связаны со значениями переменных в коде.

Я немного запутался. Как бы вы посоветовали мне это правильно реализовать?

ZackMercury 27.06.2016 22:08

Такие конструкции в AS3 не используются, а если и используются, то только с большущими костылями.
Если вам принципиальна конструкция, предлагаю написать 2-3 метода, которые организуют то, что вам нужно, вызывая друг друга циклически.
Мне кажется, или те, кто были новичками 2 года назад в AS3, стали задавать ещё более странные вопросы?

Развёрнутый ответ:
События в AS3 используют асинхронный режим. Та конструкция, которую привели вы используется только в языках, где события синхронны, и ждут события прежде, чем выполнять дальнейший код. В AS3 вы подписываетесь на событие, и код продолжает выполняться. При этом он выполняется параллельно с вызываемыми коллбеками.

Wormhole 27.06.2016 22:51

Цитата:

Сообщение от ZackMercury (Сообщение 1195158)
Такие конструкции в AS3 не используются, а если и используются, то только с большущими костылями.
Если вам принципиальна конструкция, предлагаю написать 2-3 метода, которые организуют то, что вам нужно, вызывая друг друга циклически.
Мне кажется, или те, кто были новичками 2 года назад в AS3, стали задавать ещё более странные вопросы?

Развёрнутый ответ:
События в AS3 используют асинхронный режим. Та конструкция, которую привели вы используется только в языках, где события синхронны, и ждут события прежде, чем выполнять дальнейший код. В AS3 вы подписываетесь на событие, и код продолжает выполняться. При этом он выполняется параллельно с вызываемыми коллбеками.

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

P. S. Все еще хуже, чем вы думаете. AS3 я стал изучать незадолго до выхода Creative Studio 6, т. е. где-то 3 с половиной года назад). Но Колина Мука я все же читал и об асинхронности событий в AS3 знаю

ZackMercury 27.06.2016 22:53

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

Wormhole 27.06.2016 22:58

Цитата:

Сообщение от ZackMercury (Сообщение 1195165)
Такую конструкцию лучше приберечь для языков с синхронными ивентами, в AS3 им не место, не нужно её реализовывать.
Есть конкретная задача, с которой AS3 справляется легко, а есть надуманные конструкции, которые якобы кажутся понятными, с которыми AS3 не дружит.

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

ZackMercury 27.06.2016 22:59

Дайте конкретную задачу. Что, например?

Wormhole 27.06.2016 23:07

Цитата:

Сообщение от ZackMercury (Сообщение 1195167)
Дайте конкретную задачу. Что, например?

Пошаговая игра. Боты-противники применяют свои способности, затем ждем игрока, от которого требуется ввести номер одной из десяти своих способностей. При этом, если соответствующая способность будет на перезарядке, или, скажем, на нее будет нехватать маны, мы все так же ждем валидного ввода. Затем боты-напарники применяют свои способности и все начинается по новой. Продолжаем этот цикл пока суммарное здоровье хотя бы одной из команд не опустится до 0.

ZackMercury 27.06.2016 23:11

Для этого используются состояния. Но, так как в AS3 нет enum, обычно они перечисляются в целочисленных константах и берут значения 0~∞.
Каждый кадр происходит switch по текущему состоянию, и в зависимости от него выполняются конкретные действия.
После ввода игрока, вы переключаете состояние, и продолжаете всё, что надо, затем переключаете состояние снова.

Код AS3:

const STATE_RUNNING:int = 0;
const STATE_STOPPED:int = 1;
var state:int = STATE_RUNNING;
 
function onEnterFrame(e:Event = null):void
{
    switch(state)
    {
        case STATE_RUNNING:
        //тут происходит игра, когда нужно ввести что-то, state = STATE_STOPPED;
    break;
        case STATE_STOPPED:
        //тут происходит ввод, ничего не делаем, пока пользователь не нажмёт Enter, по нему state = STATE_RUNNING;
    break;
    }
}


Wormhole 27.06.2016 23:17

Цитата:

Сообщение от ZackMercury (Сообщение 1195169)
Каждый кадр происходит switch по текущему состоянию, и в зависимости от него выполняются конкретные действия

Не очень понял, я во FlashDevelop работаю.
И что есть состояния?

ZackMercury 27.06.2016 23:21

Цитата:

И что есть состояния?
Парадигма. Я столкнулся с ней, когда пытался программировать искусственный интеллект.
https://ru.wikipedia.org/wiki/%D0%90...BD%D0%B8%D0%B5

neonoviiwolf 28.06.2016 00:14

Цитата:

Сообщение от Wormhole (Сообщение 1195170)
Не очень понял, я во FlashDevelop работаю.
И что есть состояния?

попробую я на палочках=)
Код AS3:

const STATE_RUNNING:int = 0;
const STATE_STOPPED:int = 1;
var state:int = STATE_RUNNING;
 
function onEnterFrame(e:Event = null):void
{
    switch(state)
    {
        case STATE_RUNNING:
        //тут происходит игра, когда нужно ввести что-то, state = STATE_STOPPED;
    break;
        case STATE_STOPPED:
        //тут происходит ввод, ничего не делаем, пока пользователь не нажмёт Enter, по нему state = STATE_RUNNING;
    break;
    }
}

это функция ниже подписана на события, пусть будет ENTER_FRAME. В этом случаи происходит следующее, эта функция вызывается каждый кадр
Код AS3:

function onEnterFrame(e:Event = null):void{}

дальше идет инструкция switch(state) - она смотрит значение state и дальше сравнивает значения, которые стоят в case, если они равны, то выполняется инструкция, которая стоит после case до конца инструкции, либо до break

По вашему варианту вам следует подписаться на события клавиатуры, тогда при нажатии клавиши будет срабатывать функция, а в ней вы уже проверяете что нажал игрок и какое действие/бездействие будет, т.е. будет switch, в которое заносится кнопка нажатая игроком и будет сравниваться со значениями стоящими в case, если будет совпадение, то выполняется соответствующий код. Раз у вас есть перезарядка и мана, то стоит дополнить дополнительными условиями, тот же switch или if и проверять наличие маны и перезарядку и выполнять соответствующие инструкции

Wormhole 28.06.2016 00:30

Спасибо за палочки, но я все же смог разобраться в ответе ZackMercury

undefined 28.06.2016 10:07

Цитата:

События в AS3 используют асинхронный режим. Та конструкция, которую привели вы используется только в языках, где события синхронны, и ждут события прежде, чем выполнять дальнейший код. В AS3 вы подписываетесь на событие, и код продолжает выполняться. При этом он выполняется параллельно с вызываемыми коллбеками.
Не совсем корректное высказывание.Может сложиться ложное впечатление, что флэш многопоточен и код коллбэков выполняется одновременно с остальным кодом, что не есть правда.

ZackMercury 28.06.2016 10:42

Разве нет? Значит, ошибся.
Думаю, самым надёжным будет подписка на события клавиатуры и по нажатию Enter отписка и смена состояния
Например
Код AS3:

const STATE_RUNNING:int = 0;
const STATE_STOPPED:int = 1;
var state:int = STATE_RUNNING;
 
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
//допустим, tF - наше текстовое поле для ввода
 
function onEnterFrame(e:Event = null):void
{
    switch(state)
    {
        case STATE_RUNNING:
        //тут происходит игра, когда нужно ввести что-то, state = STATE_STOPPED;
    break;
        case STATE_STOPPED:
        //тут происходит ввод, ничего не делаем, пока пользователь не нажмёт Enter, по нему state = STATE_RUNNING;
        if(!tf.hasEventListener(KeyboardEvent.KEY_DOWN)) tf.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
    break;
    }
}
 
function onKeyDown(e:KeyboardEvent = null):void
{
    if(e.keyCode == Keyboard.ENTER)
    {
        //тут выполняем действия с текстовым полем, вытаскиваем текст, сохраняем и т.д., а затем
        state = STATE_RUNNING;
        tF.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
    }
}


caseyryan 28.06.2016 12:17

Вот такую проверку
Цитата:

if(!tf.hasEventListener(KeyboardEvent.KEY_DOWN)) tf.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
Делать совсем не обязательно.
Да и вообще, зачем добавлять слушатель клавиатуры в энтерфрейме, а потом отписываться от него? Смысл?
Можно подписаться на ввод клавиатуры заранее, а потом вообще не отписываться от него. Достаточно будет какого-то простого флага, типа if (isInputAllowed) в методое обработчика, чтобы определить можно что-то вводить с клавиатуры или нет.
Не думал, что такая простая задача вызовет такое бурное обсуждение)

Wormhole 28.06.2016 18:33

Цитата:

Сообщение от caseyryan (Сообщение 1195187)
Вот такую проверку

Делать совсем не обязательно.
Да и вообще, зачем добавлять слушатель клавиатуры в энтерфрейме, а потом отписываться от него? Смысл?
Можно подписаться на ввод клавиатуры заранее, а потом вообще не отписываться от него. Достаточно будет какого-то простого флага, типа if (isInputAllowed) в методое обработчика, чтобы определить можно что-то вводить с клавиатуры или нет.
Не думал, что такая простая задача вызовет такое бурное обсуждение)

Я лично решил сделать три состояния:
WAITING
PROCESSING_INPUT
AUTOPLAY

В PROCESSING_INPUT совершается переход, только если текущее состояние является WAITING

ZackMercury 28.06.2016 18:49

Цитата:

В PROCESSING_INPUT совершается переход, только если текущее состояние является WAITING
Это как? Как в PROCESSING_INPUT может быть состояние WAITING?

Wormhole 28.06.2016 19:13

Цитата:

Сообщение от ZackMercury (Сообщение 1195194)
Это как? Как в PROCESSING_INPUT может быть состояние WAITING?

"В" в всмысле into, а не in

Добавлено через 4 часа 38 минут
Проблема: выполнение цикла останавливается после диспетчеризации события и не возобновляется после окончания приемника

Добавлено через 21 час 21 минуту
Я переписал код для ENTER_FRAME и проблема исчезла. Теперь я понял, что выполнение кода после диспетчеризации события останавливается полностью и не возобновляется само. Спасибо всем


Часовой пояс GMT +4, время: 16:26.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.