PDA

Просмотр полной версии : курсор


ProFix
06.01.2006, 19:15
:confused:
Как поменять стандартные курсоры флэша (стрелку и руку) на свои? Желательно сделать это с помощью Action Script, ну а если нельзя с помощью Action Script, то скажите другой способ... Заранее спасибо...

Reijii
06.01.2006, 19:21
создай клип назови его к примеру myCursor в него запихни свою картинку
на таймлайне напиши:


Mouse.hide();
myCursor.onMouseMove = function() {
this._x = _xmouse;
this._y = _ymouse;
updateAfterEvent();
};

Antares
06.01.2006, 19:33
А updateAfterEvent тут зачем? Чтобы ноги у машины гнулись?:)

ProFix
06.01.2006, 19:34
Пасиба за пример...
Еще какие-нибудь предложения у кого-нибудь имеются?

ProFix
06.01.2006, 19:35
а ты про updateAfterEvent можешь подробнее рассказать? я его ниразу не использовал.

Reijii
06.01.2006, 19:37
:) и то правда... больше не буду исправлюсь :rolleyes:

__i
06.01.2006, 19:37
Antares c чего ты решил что у машины будут гнуться ноги?, updateAfterEvent помогает сделать движение более плавным и все.

Reijii
06.01.2006, 19:42
я на это и расчитывал..
но не будет ли это влиять на скорость / нагрузку на "машину" ?
я просто не тестировал при больших мувиках.

__i
06.01.2006, 19:53
Специально для Antares'a провел опыт на производительность.
см. рисунок,

сверху:
красный цвет с updateAfterEvent,
зеленый - перекомпиливаю проект,
синий - без updateAfterEvent.
заметили разницу ? я лично никакой, при использовании updateAfterEvent у меня даже "пики" закрузки были ниже на 1-2%.

условия тестирования - загружена картинка, над ней рисованый курсор в виде лупы (линии, градиет, просто заливка)

__i
06.01.2006, 19:55
ну еще забыл сказать - курсором елозил довольно быстро, и настойчиво для каждого примера%))

Reijii
06.01.2006, 19:56
спасибо за поставленные опыты!

Antares
06.01.2006, 19:58
Antares c чего ты решил что у машины будут гнуться ноги?, updateAfterEvent помогает сделать движение более плавным и все.
Какое событие у нас вызывается чаще всего? Чаще, чем onEnterFrame? Правильно, onMouseMove.

Что делает updateAfterEvent? Верно, вызывает внеплановую прорисовку.
А теперь подумай, что будет, если совместить эти 2 вместе в более-менее сложном приложении.

Antares
06.01.2006, 19:59
__i, да делай, как посчитаешь нужным. Ты только не забывай, что ты других учишь :)

__i
06.01.2006, 20:05
ну опыт смотрел ?, попробуй сам, Диспечер задач есть в любой винде начиная с 2000. заметь - график без updateAfterEvent даже выше чем с ним, какой вывод?. могу как нить на досуге промоделировать "более-мение сложное" приложение? и показать результаты.

Какое событие у нас вызывается чаще всего? Чаще, чем onEnterFrame? Правильно, onMouseMove.

Это событие вызываеться именно когда двинулась мышь, а не все время, поэтому это не факт что оно вызываеться чаще чем onEnterFrame.

__i
06.01.2006, 20:07
давай поспорим на ту шапку которую не дохавали в разделе Advanced, что разници не какой?

ProFix
06.01.2006, 20:08
так, ладно обычную стрелку у меня заменить получилось, ну а как быть с "рыкой" и текстовым курсором...
И, кстати, Antares, ты прав. У меня сложном приложении с updateAfterEvent комп немного притормаживает. Может все-таки есть какие-нибудь другие способы?
Подскажите плиз. Я думаю, эта тема будет интересна для многих.

Antares
06.01.2006, 20:08
(смеется)
Вывод простой, я думаю -- раз в год и палка стреляет. Или ты намекаешь на то, что чаще перерисовывая мы УВЕЛИЧИВАЕМ производительность? ;)

Antares
06.01.2006, 20:10
Рука убирается в одну строку:

myMovieClip._useHand = false;


Текстовый курсор без Большого Геморроя не убрать. Да и зачем уго убирать, ума не приложу.

ProFix
06.01.2006, 20:11
Я ниначто не намекаю, просто прошу помощи.
Если можешь чем-нибудь помочь, буду рад

Antares
06.01.2006, 20:12
давай поспорим на ту шапку которую не дохавали в разделе Advanced, что разници не какой?
Давай я просто признаю, что ты прав, и ты не будешь нервничать?

Публично признаю: пользователь __i только что доказал недоказуемое, провея тест. Я неправ. Используйте updateAfterEvent() везде, где только можно (этого я вам не советовал :D ).

Antares
06.01.2006, 20:15
Я тебе могу словами описать:
чтобы убрать курсор, надо текстовое поле заменить на свое. Буквы прибавлять, слушая клавиатуру и аттача мувиклипы. Стиль текста можно реализовать, думаю, понятно как. Чтобы сделать удаление -- делаем буфер и ловим бэкспейс. С делитом сложнее -- надо определять позицию.

А вот выделение... можно сделать выделение с помощью TextSnapshot. Но будут "прорези".

И вообще, овчинка выделки никак не стоит

ProFix
06.01.2006, 20:16
как убрать руку, я знаю, а как ее заменить на другой курсор(не как стрелка).
В общем мне нужно заменить все курсоры флэша на свои, а текстовый курсор мне нужно убрать потому что при наведении стрелки на текст, он (текс... курсор) появляется над стрелкой.
Или скажи как скрыть стрелку при наведении курсора на текст, но текс... курсор при этом должен отображаться

Antares
06.01.2006, 20:18
Так сделайт текстовое поле невыделяемым и все. А все прочее тебе уже сказали.
Если просто скрыть -- лови момент наведения на текст и убирай мувик, служащий тебе курсором.

Все, я ушел работать дальше.

ProFix
06.01.2006, 20:19
а как поймать этот самый момент?

__i
06.01.2006, 20:35
а насколько важно те поменять именно текстовый курсор?, это не очень нормальный тон %(, пользователь всегда хочет видеть что это поле в который можно копировать выделять текст и часто ориентируеться на курсор.

Тут гдето я видел вариант через стили, устанавливают но никогда не пробывал не уверен

__i
06.01.2006, 21:02
через стили нельзя%((

Flash Player supports a subset of properties in the original CSS1 specification

а там нету понятия курсор %(

Я както давно подымал на это форуме тему о курсорах, как тогда мне объяснили нельзя использовать стандартные виндовые курсоры кроме как рука, стрелка, поле редактирования. нужно все рисовать ручками. Как бороться текстом, я думаю никак %(

ProFix
06.01.2006, 21:04
мне ввобще не важно менять текстовый курсор, просто при наведении мыши на текст над мышой появляется текстовый курсор(см. рисунок), а мне нужен над текстом просто текстовый курсор.
как этого добиться?

__i
06.01.2006, 21:06
проверяй координаты, текстовое поле имеет _x, _y, _width, _height

undeddy
06.01.2006, 21:33
Лишние строки засоряют код. Надо стремится к его упрощению и минимизации.

ProFix
06.01.2006, 21:36
to __i
Это очень долго будет. У меня в файле около 30 полей, и все в разных фреймах, с разными параметрами.
А какой еще способ смены курсора есть, ты не знаешь. Если знаешь, посоветуй.
А я вообще в АС слабоват. Не знаешь где взять эл. учебник по нему?

ProFix
06.01.2006, 21:38
Лишние строки засоряют код. Надо стремится к его упрощению и минимизации.
На счет лишних строк тебя никто не спрашивал, лучше бы помог разобраться с темой

Antares
06.01.2006, 21:55
1. Никаких эл. учебников на тему. Книги Колина Мука -- единственный способ выучиться, а не просто "знать синтаксис".

2. 30 полей в 30 фреймах -- значит, структура не продумана вообще. Или у тебя 30 состояний в приложении?

3. ПроФикс, получи плюс за неуважение к участнику форума undeddy. То, что он найфлеймил, не дает тебе права выеживаться.

ProFix
06.01.2006, 22:02
Я и не думал выеживаться...
И мысли такой в голову не приходило, я просто попросил человека помочь нам раскрыть эту тему.
А насчет непродуманной структуры ты неправ. Структура продумана.
Я делаю Autorun оболочку для CD, а следовательно в каждов фрейме описание какой-либо программы, кнопка "установить", "кряк" и т.п. Поэтому и получается такая структура.

Antares
06.01.2006, 22:04
Ну, если действительно столько состояний, то во вопросов нет.

ЗЫ: попросил ты клева. Эй ты слыш нука реши мне задачу че нет ваще казел да!?

silin
06.01.2006, 22:11
как вариант (убрать рукотворный курсор над текстфилдами):
смотрим хиттест курсора с объектами под ним, если не мувиклип, то прячемся..
в аттаче упрощенный пример (смотрим только _parent),но если надо можно ведь и все уровни просмотреть..

nyctota
06.01.2006, 22:13
Вообще, если ты делаешь авторан, и тебе некритична невозможность пользователя скопировать содержимое текстового поля -- отключи опцию Selectable у них. И всё решится само собой.

З.Ы.:

Э-эх... Тест.. еще один. На предмет частоты вызова событий onEnterFrame и onMouseMove.

частота кадров 12: совершая максимально скоростные пробеги мышью, получил срабатывание onMouseMove 7 раз против одного onEnterFrame;
частота кадров 24: при тех же телодвижениях onMouseMove вызывается 4 раза, а onEnterFrame один;
ну, и на закуску (частота кадров 100): максимум, что у меня получилось, -- чередование вызовов onEnterFrame и onMouseMove.

Вывод: уж лучше onEnterFrame :D если это возможно.

Antares
06.01.2006, 22:16
Силин, не почему ты так искусно отучаешь людей думать? ;) Я до последнего верил, что догадается...

ProFix
06.01.2006, 22:19
to Antares
Не смешно...
Ладно, я понял свою ошибку, впредь обязуюсь никого не унижать(такого я никогда и не делал, многие со мной согласятся) и оскорблять на форуме.
И, кстати, где взять эти "Книги Колина Мука"?


А какие-нибудь другие способы смены курсора (стрелки) кто-нибудь знает?

ProFix
06.01.2006, 22:22
А мне очень нужна опция Selectable, т.к. некоторые поля содержат серийные ключи к прогам

Antares
06.01.2006, 22:23
Вывод: уж лучше onEnterFrame :D если это возможно.
Зависит от частоты вождения мышью.

nyctota
06.01.2006, 22:24
to Antares
А какие-нибудь другие способы смены курсора (стрелки) кто-нибудь знает?
Походу дела, других способов просто нет.
Кстати, предложенный способ достаточно хорош, и, если тебя неустраивает только невозможность избавиться от стандартного "текстового" курсора, то, на мой взгляд, поиски другого просто не стоят свеч.

Antares
06.01.2006, 22:25
1. Нет других способов.

2. Сделай поля статическими, статический текст, вопреки мнению многих, можно выделять. Программно.

ЗЫ -- если на английском читаешь, пропиши в профиле IM или мыло.

Antares
07.01.2006, 16:55
Доминатор, вы получаете устное предупреждение, а ваш пост удален. 4й пункт правил раздела.

Elodreid
07.01.2006, 17:55
А чем startDrag не подходит для эфекта курсора?


Mouse.hide();
kursor.startDrag(true);


Вот как можно сделать исчезновение курсора


function m1(f:Number) {
if (f == 1) {
kursor._visible = true
}
if (f == 0) {
kursor._visible = false
}
}


На элементы вешаем


on (rollOver) {
m1(1);
}
on (rollOut) {
m1(0);
}

Только Антарес, что-то говорил про то что on (ClipEvent) плохо делать, но не знаю я неделю (макс) как флеш начал изучать, в хелпе прочел :))

Antares
07.01.2006, 18:03
Пользуемся тэгом [ code ] ;) Хотя спасибо, что попытался хоть как-то сохранять форматирование, но цветовая гамма для php не учитывает цвет фона...

Elodreid
08.01.2006, 01:24
Ок! ;)

Madasan
08.01.2006, 06:55
Вывод: уж лучше onEnterFrame :D если это возможно.
Не удержался тоже от теста, люблю когда за словами стоят факты!
Ну собственно вот как я пытался "пдогнуть ноги" своей машинки, которая не из самых сильных.
Пишем скриптик который посчитает среднее время проходящее между событиями:t = 5000;
tm = new Array();
p = getTimer();
_root.onMouseMove = function() {
if (getTimer()<t) {
tm.push(getTimer()-p);
p = getTimer();
} else {
var a = 0;
for (i=0; i<tm.length; i++) {
a += tm[i];
}
trace(a/i);
_root.onMouseMove = null;
}
//updateAfterEvent();
}; запускаем скрипт и водим мышкой. Через 5 сек получаем среднее время (у меня 0.0082-0.0083 сек в среднем после нескольких запусков)
запускаем еще раз и водим мышкой быстро быстро. Проделал это несколько раз, каждый раз старался быстрее,
средний результат плавал от 0,0081 до 0.0083
Теперь в скрипте раскомментируем updateAfterEvent(), и проделываем все сначала. В реультате при плавном перемещении
0.0081-0.0083 с, при быстром 0.0082-0.0083 с. Это пока не о чем не говорит, т. к. мы не утруждали процессор перерисовкой.
Надо повесить курсор.
t = 5000;
tm = new Array();
_root.attachMovie("kursor", "kursos", 1);
p = getTimer();
_root.onMouseMove = function() {
if (getTimer()<t) {
kursos._x = _xmouse;
kursos._y = _ymouse;
tm.push(getTimer()-p);
p = getTimer();
} else {
var a = 0;
for (i=0; i<tm.length; i++) {
a += tm[i];
}
trace(a/i);
_root.onMouseMove = null;
}
//updateAfterEvent();
};я взял jpg 300kb. - интервал возрос до 0.010 с при выключенном update и 0.015 с при включенном, причем изменение скорости

движения мыши уже менее заметно влияло на результат.
Я пошел дальше в попытках "подкосить ноги" моей машинке и совершил с моим и так тяжелым курсором TraceBitmap на 20000 curves.
Вот тут при апдейте интервал возрос до 0.06 с, против 0.03 с без апдейта. На этом решил эксперимент прервать, так как уже получил для себя вывод. Можно смело говорить об увеличении нагрузки на процессор при использовании updateAfterEvent, тока вот от использования его я бы отказываться не стал. Не думаю, что на маус мув придеться вешать какие-то супермегациклы или мега
перерисовки, которые бы подкосили машину, а вот если отказаться от апдейта, то это будет сразу заметно: курсор, какой бы он ни был, будет двигаться рывками. :eek:
Э-э-э-эххх, лблю эксперименты!! :p

Antares
08.01.2006, 15:42
Не думаю, что на маус мув придеться вешать какие-то супермегациклы или мега
перерисовки, которые бы подкосили машину, а вот если отказаться от апдейта, то это будет сразу заметно: курсор, какой бы он ни был, будет двигаться рывками. :eek:

Да ради бога. Счастлив тот, кто с оптимизацией не знаком. Вы можете также пользоваться сценами и onClipEvent -- мое дело сказать, что к чему.

Antares
08.01.2006, 15:42
Да, экспериментаторы -- добавьте фильтры в свои эксперименты ;)