Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.06.2016, 00:14
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 11  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Цитата:
Сообщение от Wormhole Посмотреть сообщение
Не очень понял, я во 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 и проверять наличие маны и перезарядку и выполнять соответствующие инструкции


Последний раз редактировалось neonoviiwolf; 28.06.2016 в 00:31.
Старый 28.06.2016, 00:30
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 12  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Спасибо за палочки, но я все же смог разобраться в ответе ZackMercury

Старый 28.06.2016, 10:07
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 13  
Ответить с цитированием
undefined

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

Старый 28.06.2016, 10:42
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 14  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Разве нет? Значит, ошибся.
Думаю, самым надёжным будет подписка на события клавиатуры и по нажатию 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);
    }
}
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 28.06.2016 в 11:00.
Старый 28.06.2016, 12:17
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 15  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Вот такую проверку
Цитата:
if(!tf.hasEventListener(KeyboardEvent.KEY_DOWN)) tf.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
Делать совсем не обязательно.
Да и вообще, зачем добавлять слушатель клавиатуры в энтерфрейме, а потом отписываться от него? Смысл?
Можно подписаться на ввод клавиатуры заранее, а потом вообще не отписываться от него. Достаточно будет какого-то простого флага, типа if (isInputAllowed) в методое обработчика, чтобы определить можно что-то вводить с клавиатуры или нет.
Не думал, что такая простая задача вызовет такое бурное обсуждение)
__________________
Ко мне можно и нужно обращаться на ты)

Старый 28.06.2016, 18:33
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 16  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Вот такую проверку

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

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

Старый 28.06.2016, 18:49
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 17  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Цитата:
В PROCESSING_INPUT совершается переход, только если текущее состояние является WAITING
Это как? Как в PROCESSING_INPUT может быть состояние WAITING?
__________________
There is no thing in this world that is not simple.

Старый 28.06.2016, 19:13
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 18  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Цитата:
Сообщение от ZackMercury Посмотреть сообщение
Это как? Как в PROCESSING_INPUT может быть состояние WAITING?
"В" в всмысле into, а не in

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

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 07:21.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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