PDA

Просмотр полной версии : Class DoubleClick для AS2


Vektor
31.05.2008, 11:58
Мне интересно, почему в ActionScript2 не создали стандартный
Class DoubleClick.
В поисковике на форуме нечего путного не нашел
Решил исправить этот недочет, написал свой.
Первый для CS3.
Второй для 8.флеш.
_______________________
Правильно заданный вопрос, дает быстрый ответ.

Alex_beginner
31.05.2008, 12:50
Vektor! fla файл неоткрывается. Видимо Вы писали в Adobe CS3?
А что этот класс делает?!

Если он реализует одинарный ,двойной клик итд, это можно реализовать и так:
var ID:Number=0;
var clickNum:Number=0;

myClip.onPress = function():Void
{
clickNum++;
if (ID==0) ID=setInterval(myFunc,200);
}

function myFunc():Void
{
clearInterval(ID);
ID=0;
switch (clickNum)
{
case 1: {действия при 1 клике; break;}
case 2: {действия при 2-м клике; break;}
....
}

clickNum=0;
}

И потом тут полно подобных тем. Воспользуйтесь поиском

Wolsh
31.05.2008, 14:51
Vector, a так не проще?
class DoubleClick {
private var wait:Boolean = false;
private var _interval:Number = null;
public function ifDouble(f:Function, t:Number):Void {
t = t ? t : 300;
if (wait) {
f();
clearInt();
} else {
_interval = setInterval(this, "dc", t);
wait=true;
}
}
private function dc():Void {
wait ? clearInt() : !!wait;
}
private function clearInt ():Void {
clearInterval(_interval);
_interval = null;
wait=false;
}
}2 Alex beginner : ужас. К тому же вопрос про АС2.

Alex_beginner
31.05.2008, 15:15
Wolsh!

Alex beginner : ужас. К тому же вопрос про АС2.

Ваша реплика непонятна мне.

1. Где Вы вообще видите вопрос?! Когда человек поделился, созданным им классом!
2. А на счет двойного щелчка - весь форум "пропитан" этими постами, и тема, собственно, не актуальна.
http://flasher.ru/forum/showthread.php?threadid=62551
3. Класс создается с определенной целью. В данном случае для отслеживания события двойного щелчка. Однако, ту же самую функцию может выполнить "прямой" код.

Вы забыли зачем вообще было введено понятие "класс". Почитайте произведение Вашего кумира - Колина Мука ("ActionScript 2.0. Основы"). Он прекрасно и точно описывает это понятие.
Ну например, в Вашем классе нет конструктора.:)

Удачи в изучении!

Wolsh
31.05.2008, 16:34
Понятие класс было введено ( :) ) чтобы не писать этот пинг-понг в обработчики событий для 30 кнопок. Я даже представить себе не могу, что за мешанина получится при использовании Вашего "прямого" (надеюсь этот эпитет - шутка) кода в таком далеко не самом экстремальном случае (у меня был проект с 2000 кликабельных клипов).

iNils
31.05.2008, 16:38
Ну например, в Вашем классе нет конструктора.:)У класса Delegate тоже нет конструктора.

Alex_beginner
31.05.2008, 16:43
этот пинг-понг - это было круто сказано. Посмеялся от души:)

Но увы! Никакой мешанины не будет, если грамотно перестроить код под свои цели.

А чем Вам слово "прямой" код непонравилось. Предложите другой термин для этого кода, я при разговоре с Вами буду пользоваться им для улучшения понимания.

Ну ладно. Это все лирика. Вы ответьте на вопрос у Вас в классе должен быть конструктор или нет? А то че то ваш код неработает, а почему немогу разобраться. Поможите плиз!

iNils! Вопрос нужен ли конструктор здесь или нет!?
Я думаю нужен.

iNils
31.05.2008, 16:59
Alex_beginner, когда хотите что-то добавить, используйте кнопку http://www.flasher.ru/forum/images/russian/style3/buttons/edit.gif, а не занимайтесь мультипостингом.

Мне код обоих не нравится. Поэтому, нужен там конструктор или нет, не важно. Все равно не гуд.

Wolsh
31.05.2008, 17:00
Вы имя функции поставьте как в классе, я его поменял.
Класс не у меня. Я только прорефакторил код.
Меня он не устраивает. И отсутствием конструктора в том числе.
В таком виде это одноразовый класс))))

Alex_beginner
31.05.2008, 17:01
iNils! Я извиняюсь и исправляюсь.
Vektor!
1. Я давал Вам примерную ссылку. Ранее я указал, что весь форум "пропитан" такими темами. Если Вы не умеете пользоваться поиском, так учитесь. Кстати ссылка была из раздела "... для профессионалов". Делайте выводы.

Alex_beginner - пожалуйста, не давай больше таких ссылок, страх божий.
Может для 6-версии, это было неплохо, не застал те времена.
Я Вам дал ссылку, а Вы сами решайте что с ней делать.

2. Давайте не будем голословными. А то сказать, что "нравиться" или "не нравится" легко, а вот доказать свои слова гораздо труднее. Поэтому я спрошу: "Мой код не работает или работает?". Ежели он работает, то я свою функцию выполнил, худо, бедно , но выполнил. Если же нет, докажите.

3. Ваш код написан "ленивыми лексемами", т.е. используете всякие там "?",":", вместо if..{} - все это сильно ухудшает читабельность кода. Это не факт, это больше, чем факт - так оно и есть на самом деле.

Vektor
31.05.2008, 22:52
Alex_beginner - пожалуйста, не давай больше таких ссылок, страх божий.
Может для 6-версии, это было неплохо, не застал те времена.
А класс писался для того, чтоб его было просто использовать.

Wolsh - Твой код красивей.
Пожалуйста, обьясни как работает (!!wait;).
С одним (!) я знаю, а с двумя.
_______________________
Правильно заданный вопрос, дает быстрый ответ.

Wolsh
01.06.2008, 00:55
Быстрый ответ: как копирайт)))
Можете написать null, в этом месте надо было поставить "бездействие".
Я поставил копирайт. Практически случайно))) Извините если напряг Вам мозг)

wvxvw
01.06.2008, 01:19
У класса Delegate тоже нет конструктора.

Это как это нету? Конечно, есть =) Но, вообще, конструктор самому писать не обязательно, но класса без конструктора быть не может (т.е. свято место пусто не бывает, и конструктор будет автоматически создан) =)
В конкретном случае с делегатом - у него есть самый настоящий "рукописный" конструктор =) принимает в качестве параметра функцию и делает из нее делегата =)
function Delegate(f:Function)
{
func = f;
}
:rolleyes:

iNils
01.06.2008, 02:01
но класса без конструктора быть не можетЭто все условности

olexandr
02.06.2008, 14:11
3. Ваш код написан "ленивыми лексемами", т.е. используете всякие там "?",":", вместо if..{} - все это сильно ухудшает читабельность кода. Это не факт, это больше, чем факт - так оно и есть на самом деле.

Все не читал! Но увидел эти строки и не смог не ответить! Где написано, что это ухудшает читаемость? Мне так проще читать и в случае однострочных действий на условие, я сам всегда так пишу!

Следующие строки у меня присутствуют практически во всех проектах и это очень удобно и понятно:
System.capabilities.isDebugger ? trace(url) : getURL(url);
и
var xmlPath:String = xml_path == undefined ? 'data.xml' : xml_path;

Alex_beginner
02.06.2008, 14:23
olexandr! Увы нет! Читабельность кода ухудшается.

Цитирую Гурского:


if (a>b) {
trace(a);
} else {
trace(b);
}
a>b? trace(a): trace(b);
Как видно из приведенного примера, оператор «?:» может значительно уменьшить
количество набираемого кода. Впрочем, это оправданно только в том случае, если
с условным предложением связан относительно простой скрипт. В противном
случае программа станет нечитабельной (или, что весьма вероятно, просто не сможет транслироваться)

Впрочем, тут и цитировать то не нужно, чтобы понять, что это так.!!:)

silin
02.06.2008, 15:00
цитировать действительно не нужно, тем более Гурского..
тут дело личных пристрастий..
к слову, Adobe рекомендует (http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions) пользовать тернарный оператор вместо if/else в простых выражениях

Alex_beginner
02.06.2008, 15:07
Ясно! Опять Гурский нервно курит в сторонке. Что ж Вы его так не цените?!. Ведь он вполне хорошо описал внутреннюю "алхимию" флеша.

silin
02.06.2008, 15:17
именно что "алхимию", точно сказано
это и было ценно в свое время, но сегодня-то флеш уже не тот, алхимия теперь скорее во вред..

Alex_beginner
02.06.2008, 15:26
А Гурский не сегодня писал. Он свою первую книгу давно написал - тогда она была актуальна. А некоторые принципы и по сей день актуальны. Хотя вопрос риторический.!

chingachgoog
02.06.2008, 15:48
цитировать действительно не нужно, тем более Гурского..
тут дело личных пристрастий..
к слову, Adobe рекомендует (http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions) пользовать тернарный оператор вместо if/else в простых выражениях


Адоб может что хочет писать, но байт-код показывает (для примера выше), что тернарный оператор тяжеловеснее:

обычное условие:

constants 'a', 'b'
push 'a'
getVariable
push 'b'
getVariable
greaterThan
not
branchIfTrue label1
push 'a'
getVariable
trace
branch label2
label1:
push 'b'
getVariable
trace
label2:

тернарное:

constants 'a', 'b'
push 'a'
getVariable
push 'b'
getVariable
greaterThan
branchIfTrue label1
push 'b'
getVariable
trace
push UNDEF, UNDEF
branch label2
label1:
push 'a'
getVariable
trace
push UNDEF, UNDEF
label2:
pop


именно что "алхимию", точно сказано
это и было ценно в свое время, но сегодня-то флеш уже не тот, алхимия теперь скорее во вред..


Во вред, если только адобу - могут взять большие сомнения по-поводу расхваливания AVM2.

olexandr
02.06.2008, 16:05
Дискуссия ни о чем!

и в случае однострочных действий на условие

Цитирую Гурского:
это оправданно только в том случае, если с условным предложением связан относительно простой скрипт


Неужели в этих фразах есть принципиальная разница? Ну значит я не умею красиво изъясняться. Приведенные мной примеры, очень даже подходят под определение того же Гурского.

iNils
02.06.2008, 16:08
тернарный опреатор хорош для установки дефолтных значений аргументов, если они не заданы.

silin
02.06.2008, 17:06
chingachgoog, "сомнения по-поводу расхваливания.." здесь как бы и не причем, вопрос читабельности и удобства редактирования.., а это дело личное ( ну или корпоративное)

по тяжеловесности: ты, видимо, смотрел файл скомпиленный IDE-шным компилятором..
MTASC-сковй swf тернарную конструкцию считает быстрее
тест:
var t:Number;
var b:Number;
t = getTimer();
//////////////////////"пустой цикл"
for (var i:Number = 0; i < 1e6; i++)
{
b = 0;
}
var dt0:Number = getTimer() - t;
///////////////if-else
t = getTimer();
for (var i:Number = 0; i < 1e6; i++)
{
if (true) b = 0
else b = 1;

}
var dt:Number = getTimer() - t;
trace( "dt: " + (dt - dt0) );//233(mtasc) 138(IDE)
///////////////////ternary
t = getTimer();
for (var i:Number = 0; i < 1e6; i++)
{
b = true ? 0 : 1;
}
dt = getTimer() - t;
trace( "dt ? : " + (dt-dt0) );//167(mtasc) 269(IDE)

chingachgoog
02.06.2008, 17:30
Ну так все равно выходит, что обычное условие 138(IDE) быстрее тернарного 167(mtasc). А уж почему в mtasc тернарный быстрее - это понятия не имею - меня родной более чем устраивает.
А лучше вы готовые swf-ники выложите - тогда байт-код фласмом посмотреть можно будет, в чем там дело, почему компилируются по-разному.

silin
02.06.2008, 17:56
>>Ну так все равно выходит..
для кого все равно, а для кого и нет Ж)

wvxvw
03.06.2008, 03:11
По поводу рекоммендаций Адобе... они как вещие сны имеют тенденцию сбываться %) Если рекомендуют в этой версии - в следующей, почти наверняка то, что рекомендовали, либо будут оптимизировать, либо сделают обязательным. Кроме того вы тестили АС2, а он по определению не объект для рекоммендаций - разработчики-то наверняка имели в виду АС3 =)
ЗЫ, ну и на всяк случай потестил флешевый и флексовй компайлеры с тем же кодом:

Using the Flex Compiler Shell.
package
{
import flash.display.Sprite;
import flash.utils.getTimer;

public class Main extends flash.display.Sprite
{
public function Main():void
{
var time:int;
var b:int;
var i:int;
///////////////if-else

time = getTimer();
for (i = 0; i < 10000000; i++)
{
if (true) b = 0
else b = 1;

}
var dt:int = getTimer() - time;
trace( "dt: " + dt);
///////////////////ternary
time = getTimer();
for (i = 0; i < 10000000; i++)
{
b = true ? 0 : 1;
}
dt = getTimer() - time;
trace( "dt ? : " + dt);
}
}
}
dt: 967
dt ? : 1001

Flash IDE:
var time:int;
var b:int;
var i:int;
///////////////if-else

time = getTimer();
for (i = 0; i < 10000000; i++)
{
if (true) b = 0
else b = 1;

}
var dt:int = getTimer() - time;
trace( "dt: " + dt);
///////////////////ternary
time = getTimer();
for (i = 0; i < 10000000; i++)
{
b = true ? 0 : 1;
}
dt = getTimer() - time;
trace( "dt ? : " + dt);
dt: 50
dt ? : 69

etc
03.06.2008, 10:54
wvxvw, результаты наоборот должны быть, это первое. А во-вторых, использовать в качестве теста на производительность первый кадр документа в IDE неразумно, в особенности при работе с подобными итераторами. Если и использовать, то только в виде вызова некоторой функции test.
А что касается тернарного оператора, то никакой разницы с точки зрения производительности нет.

chingachgoog
03.06.2008, 11:25
wvxvw, так у вас вышло, что AVM1 быстрее AVM2 в 15-20 раз?

Ну а то, что обычное условие быстрее тернарного выполняется, после просмотра байт-кода - не секрет.

silin, байт-код во вложении, можно открыть любым текстовым редактором.
Оценить mtasc уже можно по весу файла.

etc
03.06.2008, 12:39
wvxvw, так у вас вышло, что AVM1 быстрее AVM2 в 15-20 раз?
Оба примера кода под AVM2.

chingachgoog
03.06.2008, 13:18
Оба примера кода под AVM2.

тем более странна разница между флеш- и флекс-редакторами.

etc
03.06.2008, 13:25
тем более странна разница между флеш- и флекс-редакторами.
Я уже говорил, что результаты при подобных примерах должны быть наоборот. Да и тест в IDE неверный.

chingachgoog
03.06.2008, 13:34
Я уже говорил, что результаты при подобных примерах должны быть наоборот. Да и тест в IDE неверный.

Да какая разница - наоботор или не наоборот? Вообще почему результат РАЗНЫЙ, если и то и другое на одной AVM якобы обсчитывается?
И код в кадре тут не при чем - это на таймер никак не влияет в данном случае.
Вот тут бы еще wvxvw привести результат для AVM1 - совсем здорово бы было.

etc
03.06.2008, 13:39
Код в кадре — притом. Я уже писал (http://etcs.ru/blog/as3/slow_increment_ii/) об этом.
Если правильно проводить тесты, то разницы не будет.

wvxvw
03.06.2008, 14:17
__etc:
не, результаты именно такие =) помоему они просто в разных единицах считают, т.е. первые результаты надо на 10 поделить... или на 60 %)
И это... твой пример по ссылке в Флаш ИДЕ должен был бы вообще нули выдать, евойный компайлер умеет не считать пустые циклы =)

etc
03.06.2008, 14:50
wvxvw, запусти тест не во флексовом дебаговом режиме.

wvxvw
03.06.2008, 21:56
а ну да... не подумал =)