Форум 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=203376)

boyard 20.09.2013 02:49

редактор квестов
 
Доброе время суток, уважаемые форумчане. решил я тут собрать редактор квестов. при попытке связать область выполнения с менеджером кнопок, возникло пару вопросов(моя память говорит, что где-то я уже видел реализацию всего этого, но из-за разных мыслей не могу придумать толковое описание каждого из вопросов):
1) можно ли повесить внешнего(относительно класса) слушателя событий на изменение переменной без использования EnterFrame?{есть у меня менеджер кнопок, в зависимости от нажатой кнопки на цене выполняется действие. номер нажатой кнопки хранится во внутренней переменной(доступной внешне только для чтения) можно ли отслеживать изменение переменной с главной сцены, не добавляя обработчик EnterFrame?}
2) что менее нагрузит систему: HitTest или слушатель клика мыши?{на сцене, локации отображаются точками. что будет выигрышнее: 1-повесить на всю сцену слушателя клика мыши, и искать локацию, на которую кликнули hitTest ом или же повесить на каждую локацию свой собственный слушатель клика мыши?}

Akopalipsis 20.09.2013 02:57

Мне кажется, что для отслеживания изменения какой либо переменной есть только два способа - сделать сеттер и при его изменении посылать событие. И ещё есть биндинг http://blog.diestro.ru/binding-v-actionscript-1/
И наверное лучше повесить слушателя на мышь и там проверять target.

boyard 20.09.2013 10:41

Цитата:

Сообщение от Akopalipsis (Сообщение 1146513)
Мне кажется, что для отслеживания изменения какой либо переменной есть только два способа - сделать сеттер и при его изменении посылать событие. И ещё есть биндинг http://blog.diestro.ru/binding-v-actionscript-1/

dispatchEvent() уже побывал, у меня почему-то не хочет установить связь между 2 предками одного родителя...
Цитата:

Сообщение от Akopalipsis (Сообщение 1146513)
И наверное лучше повесить слушателя на мышь и там проверять target.

спасибо, совсем упустил из вида target(хотя буквально в соседнем классе активно его использую);

появился еще 1 вопрос: возможно ли использовать строку, как строку ввода логических условий?{есть 3 переменные: p1, p2, p3, и 2 строки: в первой строке пользователь задает условие((p1!=p2) and (p1>5)) во второй - действие (p3=p1*p2)}

AlexCooper 20.09.2013 12:23

Цитата:

Сообщение от boyard (Сообщение 1146521)
появился еще 1 вопрос: возможно ли использовать строку, как строку ввода логических условий?{есть 3 переменные: p1, p2, p3, и 2 строки: в первой строке пользователь задает условие((p1!=p2) and (p1>5)) во второй - действие (p3=p1*p2)}

можно но придется ручками написать парсер таких строк

Babylon 20.09.2013 14:54

Для ввода условий можно использовать булевы переменные и даже затолкать их в словарь

Akopalipsis 20.09.2013 16:28

Цитата:

у меня почему-то не хочет установить связь между 2 предками одного родителя...
А у меня тоже вопрос появился - можно как то событие детьми ловить?

AlexCooper 20.09.2013 16:45

На счёт событий

Добавлено через 1 минуту
скорей всего нужно самому посылать событие ребёнку, либо сделать метод для этого действия, либо подписывать родителя у ребёнка.

Добавлено через 5 минут
если это ДО
Код AS3:

import flash.display.Sprite;
import flash.events.Event;
 
var papa:Sprite = new Sprite();       
var child:Sprite = new Sprite();
 
papa.addChild(child);
 
papa.addEventListener('event', function(e:Event){ trace('papa')} );
child.addEventListener('event', function(e:Event){ trace('child')} );
 
child.parent.addEventListener('event', function(e:Event){ trace('papa child')} );
 
child.dispatchEvent(new Event('event')); // child
papa.dispatchEvent(new Event('event'));
// papa
// papa child


boyard 20.09.2013 18:07

Цитата:

Сообщение от AlexCooper (Сообщение 1146526)
можно но придется ручками написать парсер таких строк

думал что есть что-то встроенное... значит снова будем писать парсер.

AlexCooper 20.09.2013 19:23

Вот нечего было делать, наваял вам небольшой парсер, работает только с условием AND нет проверок на пробелы, вообще м как, примерно показал.

Код AS3:

 
var fLib:Object = new Object();
        fLib['=='] = ravno;
        fLib['!='] = neravno;
        fLib['>'] = bolshe;
        fLib['<'] = menshe;
 
function bolshe(arg:Array):Boolean {
        return arg[0]>arg[1];
}
 
function menshe(arg:Array):Boolean {
        return arg[0]<arg[1];
}
 
function ravno(arg:Array):Boolean {
        return arg[0]==arg[1];
}
 
function neravno(arg:Array):Boolean {
        return arg[0]!=arg[1];
}
 
var variables:Object = new Object();
        variables['p1'] = 1;
        variables['p2'] = 2;
        variables['p3'] = 2;
 
var commandLine = '(p1!=p2) AND (p2==p3) AND (p1<2)';
 
var resultCommand:Boolean = interpretator(commandLine);
 
trace(resultCommand); // true
 
function interpretator(line:String):Boolean {
 
        var funcTemp:Array = new Array();
 
        var funcDump:Array;
 
        // разбиваем на логические И
        var ifDump:Array = line.split('AND');
 
        var resultDump:Array = new Array();
 
        var result:Array = new Array();
 
        // проходим по логическим составным
        for each( var subcommand:String in ifDump) {
 
                // ищем функции
                for ( var func:String in fLib) {
 
                        // разбиваем на элементы
                        funcDump = subcommand.split(func);
 
                        // если два и более элемента значит нужно выполнить эту логическую функцию
                        if (funcDump.length>1) {
 
 
                                if (!resultDump[func]) resultDump[func] = new Array();
 
                                // парсим переменные
                                variableParser(funcDump);
 
                                // результаты в массив
                                resultDump[func].push(funcDump);
                        }
                }
        }
 
        // выполняем функции
        for ( func in resultDump) {
 
                // пока есть элементы
                while (resultDump[func].length) {
 
                        // выбираем по парам и выполняем соответсвующию функцию
                        result.push(fLib[func]( resultDump[func].shift() ) );
                }
 
        }
 
        // только для условия И ( нужно доработать )
        var resultBoolean:Boolean = true;
 
        for each( var resB:Boolean in result ) {
 
                if (resultBoolean) resultBoolean = resB;
        }
 
        return resultBoolean;
}
 
function variableParser(arr:Array):void {
 
        // проходим все пары элементов
        for ( var i:uint = 0; i <arr.length ; i++) {
 
                var varIndex:String;
 
                var ind:Number;
 
                if (i%2) {
                        // если элемент после знака оператора то ищем дугу
                        ind = String(arr[i]).indexOf(')');
 
                        // режем текст до дуги
                        varIndex = String(arr[i]).substr(0,ind);
 
                } else {
                        // если элемент перед оператором
                        ind = String(arr[i]).lastIndexOf('(');
 
                        // режем текст с начала строки до дуги
                        varIndex = String(arr[i]).substr(ind+1,String(arr[i]).length);
                }
 
                // находим переменную и переопределяем массив
                arr[i] = (variables[varIndex]) ? variables[varIndex] : varIndex;
 
        }
 
}


MikroAcse 20.09.2013 21:10

Код AS3:

fLib['=='] = ravno;
        fLib['!='] = neravno;
        fLib['>'] = bolshe;
        fLib['<'] = menshe;

Мои глаза!!!


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

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