Просмотр полной версии : Флэш забивает на прорисовку мувиков с координатой > 4005 ?
Всем привет.
Столкнулся вот с чем: у меня есть мувик bgr, в нем еще два мува, а и b. для а написана онЕнтерФрейм-функция, увеличивающая его y-координату до того момента, пока а не ляжет своим центром на b. Проверяется этот момент хитТестом. Все работает, но когда я начинаю перемещать общий мув bgr по иксу, то при bgr._x > 4005 мув а начинает двигаться по игреку, как будто b под ним исчез. Вырезка из трейса (первое число - bgr._x, второе - bgr.a._y):
3999
-3.5
____________
4000
-3.5
____________
4001
-3.5
____________
4002
-3.5
____________
4003
-3.5
____________
4004
-3.5
____________
4005
-3.5
____________
4006
1.5
____________
4007
6.5
____________
4008
11.5
____________
Мой вопрос заключается в том, как можно этого избежать и верно ли мое предположение в теме поста? Спасибо.
Alex_beginner
29.05.2008, 14:24
Из Вашего исходника, понять, собственно ниче нельзя. Если можно изложите идею словесно и по-подробнее, т.е. что Вы хотите реализовать. Я думаю так будет проще, чем мы будем парсить мозгом ваш исходник.
Сразу же есть несколько советов.
1. Делайте по возможности все на основной временной шкале а не на шкалах вложенных мувов, т.е не bgr....onEnterFrame, а _root.onEnterFrame и в первом кадре (если нет прелоадера). Это способствует централизации кода, т.е. и Вам и другим флешерам легкче будет с ним разбираться.
Поясните пожалуйста зачем Вам 2 слой. Я не вижу там никаких трасформаций или действий?
Исходник проще этого трудно себе представить.. Я не знаю как в нем можно что-то не понять. Этот файл иллюстрирует мою проблему. Если бы меня интересовало использование _root.onEnterFrame, я бы так и написал.
2. Не уничтожаю, т.к. он мне нужен. В реальной задаче мув b может менять координаты, и мув a при этом должен опускаться на него.
Alex_beginner
29.05.2008, 15:10
На счет _root.onEnterFrame львиная доля всех динамических процессов может быть описана в onEnterFrame главной временной шкалы и нет необходимости делать его на клипах, кнопках и др. кадрах итд.
Давайте уточним.
1. Есть клип-контейнер - bgr;
2. В bgr есть два клипа bgrr и char;
3. Необходимо менять свойство char._y до момента совпадения координат его центра и края клипа bggr;
4. Остановка процесса;
Если что то не так или что-то я упустил попавьте меня, указав номер пункта и поправку.
chingachgoog
29.05.2008, 15:36
Вот простой исходник.
Как видно дело в ограничениях третьего синтаксиса хиттеста.
Alex_beginner
29.05.2008, 15:42
А вот так организовать процесс нельзя?
var centralPoint:Object = {x:0,y:0}; //для точки регистрации в центре клипа
this.onEnterFrame = function():Void
{
this.bgr.char._y +=3;
centralPoint.x=0;
centralPoint.y=0;
this.bgr.char.localToGlobal(centralPoint);
if (this.bgr.bgrr.hitTest(centralPoint.x,centralPoint.y,true))
{
delete this.onEnterFrame;
trace("столкновение");
};
}
Видите ли hitTest принимает в качестве параметров координаты в координатной системе основной шкалы. А отследить все изменения координат от изменения координатных систем вложенных клипов может localToGlobal.
Alex_beginner
29.05.2008, 15:49
Сhingachgoog! Большой змей! :)Скажи мне а че он вообще то хотел, если ты понял.
Вот еще что непонятно. Как можно достигнуть координаты 4005 если максимальные размеры холста -2880 px.
chingachgoog
29.05.2008, 16:26
Скажи мне а че он вообще то хотел, если ты понял.
sinya нашел интересный глюк и высказал правдоподобное объяснение сего явления. Скорее всего он прав. Но точно могут сказать только разработчики метода хитТест (они знают, как он НА САМОМ ДЕЛЕ работает)
Вот еще что непонятно. Как можно достигнуть координаты 4005 если максимальные размеры холста -2880 px.
Холст может быть практически любых размеров. Это битмапа не может быть больше 2880.
add:
А вот так организовать процесс нельзя?
В этом нет смысла для поставленного вопроса. В моем примере шарик вообще не падает.
Alex_beginner
29.05.2008, 16:36
chingachgoog! Я не твой пример модифицировал, а его - посмотри его исходник.
Потом насчет размеров, программно задать 4005 ширину клипа можно, а вот с панели Properties нельзя.
Вопрос возникает зачем задавать такие размеры клипа? !
Кстати смотри вот какой еще глюк есть:
var centralPoint:Object = {x:0,y:0}; //для точки регистрации в центре клипа
this.onEnterFrame = function():Void
{
this.bgr.char._y +=0.1;
centralPoint.x=0;
centralPoint.y=0;
this.bgr.char.localToGlobal(centralPoint);
if (this.bgr.bgrr.hitTest(centralPoint.x,centralPoint.y,true))
{
delete this.onEnterFrame;
trace("столкновение");
};
/*this.bgr._x+=2;
_root._x-=2;
trace(this.bgr._x);*/ закомментированный блок
}
Вот так все вроде бы нормально. Расскоментируешь закомментированный блок, как с первого взгляда ничего непроизошло - клип bgr остается на месте, но столкновения не просиходит, как будьто глобальная координатная система не привязана к _root.
Потом насчет размеров, программно задать 4005 ширину клипа можно, а вот с панели Properties нельзя.Не проверял в cs3, а в flash 8 можно сделать высоту и ширину размеров 5760 (2880 * 2). И это без учета того, что можно зайти потом в объект и изменить размеры внутри.
Alex_beginner
29.05.2008, 17:13
В Properties? Если такое возможно через вкладку Properties (свойства документа) покажите как плиз!
chingachgoog
29.05.2008, 17:17
chingachgoog! Я не твой пример модифицировал, а его - посмотри его исходник.
Я это понял. Собственно потому свой исходник и выложил, что он более простой. Его еще, кстати можно упростить. Совсем убить кругляшок и заменить код на:
bgr.onEnterFrame = function () {
if (!bgr.bgrr.hitTest(this._x + 16, this._y +16, true)) {
trace("hitTest2(true)")
}
if (!bgr.bgrr.hitTest(this._x + 16, this._y + 16, false)) {
trace("hitTest2(false)")
}
if (!bgr.bgrr.hitTest(this)) {
trace("hitTest1")
}
this._x+=10;
trace (this._x);
}
Потом насчет размеров, программно задать 4005 ширину клипа можно, а вот с панели Properties нельзя.
Вопрос возникает зачем задавать такие размеры клипа? !
Почему нельзя? Я вот только что сделал за 3300...
Alex_beginner
29.05.2008, 17:22
Я тоже пробовал. Пишет, что задавайте значения от 1 до 2880
Кстати на счет твоего примера. Я так понял ты продемонстрировал возможности метода hitTest в разных транскрипциях?
И потом весить onEnterFrame на клипы кроме главной временной шкалы - плохая практика.
В Properties? Если такое возможно через вкладку Properties (свойства документа) покажите как плиз!Вы размерах клипа говорили:
размеров, программно задать 4005 ширину клипа можно
А теперь о документе?
И для документа, это лишь ограничения flash ide.
А вот согласно формату swf, размер можно задать 53'687'091 пикселей.
Там Rect структура, по 5 битов на число задающие число битов для Xmax и Ymax (Xmin и Ymin для размеров сцена всегда 0). 5 битов позволяют использовать 31 бита для размера, один бит уходит на знак и остается 30 битов.
А это 1'073'741'823 твипсов, делим на 20 и получаем 53'687'091 пикселей.
И потом весить onEnterFrame на клипы кроме главной временной шкалы - плохая практика.Да? Во времена до AS2, "классы" расширяющие MovieClip писались в клипах.
Alex_beginner
29.05.2008, 18:05
Есть концепция централизации кода! Вы вероятно о ней слышали. Но никто и не говорит, что нельзя писать код в клипах. Считается, что лучше писать код в одном месте для улучшения читабильности (централизация) кода, лучше это делать, на мой взгляд, на _root.
А на счет документа мы видимо друг друга непоняли. Ведь Sanyia не создавал клипы программно, он их создавал на стадии конструирования.
Так вот я говорил о Stage. Поскольку в Properties задается размеры документа.
Есть концепция централизации кода! Вы вероятно о ней слышали. Ну есть и что? Я могу привести множество примеров, когда эта концепция не жизнеспособна.
А на счет документа мы видимо друг друга непоняли. Ведь Sanyia не создавал клипы программно, он их создавал на стадии конструирования.
Так вот я говорил о Stage. Поскольку в Properties задается размеры документа.Я до сих пор вас не понимаю. Какая связь между Stage и тем, что Sanyia создавал клипы руками?
chingachgoog
29.05.2008, 18:28
Я тоже пробовал. Пишет, что задавайте значения от 1 до 2880
Это просто. Перемещаете мувик вручную до упора вправо - границы стейджа расширились. Перемещаете еще раз - опять расширились. И т.д.
В панели свойств появляются соответствующие значения.
Кстати на счет твоего примера. Я так понял ты продемонстрировал возможности метода hitTest в разных транскрипциях?
Это разный ПРИНЦИП действия хитТеста. И что характерно - глюк только в том варианте, где должны высчитываться контуры фигуры (т.е. практически прорисовываться). Если подождете во время выполнения кода, то все поймете.
И потом весить onEnterFrame на клипы кроме главной временной шкалы - плохая практика.
Не понял о чем это? Код написан на главной временной диаграмме, в первом кадре на отдельном верхнем слое.
Alex_beginner
29.05.2008, 19:09
iNils! Поясню что я имел ввиду.
1. 4000 px это за пределами стэйж. Зачем ему понадобилось двигать клип за пределы стэйж, так далеко?!
2. Концепция не может быть не жизнеспособной или жизнеспособной. Этот термин не подходит. Концепция, она либо есть либо ее нет. Поскольку, лично для меня и, я думаю, для других тоже, было бы очень удобно, наблюдать написанный код в одном месте такая концепция есть. Но, другое дело, что ее не всегда можно воплотить в жизнь. Тут я с Вами бы согласился.
chingachgoog! А почему бы Вам не писать код на события главной временной шкалы (я имею ввиду только onEnterFrame), коль написано на главной временной шкале, да еще и в первом кадре:) И я показал пример как с тем же успехом вызывается обработчик _root.onEnterFrame.
4000 px это за пределами стэйж. Зачем ему понадобилось двигать клип за пределы стэйж, так далеко?!Тут два вопроса возникает:
1. Что нужно в итоге получить и найти решение задачи другими возможными путями (это к автору вопроса)
2. Почему так происходит. (меня интересует этот вопрос)
chingachgoog
29.05.2008, 19:18
chingachgoog! А почему бы Вам не писать код на события главной временной шкалы (я имею ввиду только onEnterFrame), коль написано на главной временной шкале, да еще и в первом кадре:) И я показал пример как с тем же успехом вызывается обработчик _root.onEnterFrame.
У автора был обработчик на мувике - его право, я так и оставил. :) Может у него на руте другой обработчик onEnterFrame?
Это вообще не принципиальный вопрос. Можно вообще на object повесить. :)
add:
Почему так происходит. (меня интересует этот вопрос)
Меня тоже. Но боюсь, кроме разработчиков ФП вряд ли кто сможет ответить.
Alex_beginner
29.05.2008, 19:20
iNils! Извините! п.1 и п.2 я непонял. Поясните вопросы, если это ко мне.
А то, что насчет задачи, честно говоря я непонимаю всю эту конструкцию, которую задумал автор (посмотрите его исходник).
iNils! Извините! п.1 и п.2 я непонял. Поясните вопросы, если это ко мне.
Первый к автору, второй - ко всем.
Откинул все лишние и вот что получается.
...
4078
4079
>>>>4080
>>>>4081
...
А теперь заходите во внутрь клипа и уменьшайте ширину на 10 и запускайте снова. Трейс один и тот же до ширины 20, а вот при 10 пикселях картина меняется.
...
4086
4087
>>>>4088
>>>>4089
...
Это навело меня на мысль и я сделал размер 1 и по x поставил -1.
...
4094
4095
>>>>4096
>>>>4097
...
Такая же картина с отрицательными значениями.
Отсюда вывод, для hitTest с флагом, координаты имеют ограничение в 16 бит + 1 бит на знак.
1. Что нужно в итоге получить и найти решение задачи другими возможными путями (это к автору вопроса)
Уже решил, спасибо.
Поясню, зачем это было нужно. Есть игра, в ней персонажи, объекты, которые можно поднимать, бэкграунд-рельеф, по которому ходят и т.п. Когда персонаж закончил ход, он удаляется из основной сцены и аттачится внутрь бэкграунда. Когда же действие игры происходит в другом месте, идет фокусировка на него, срабатывает прокрутка, бэкграунд перемещается относительно экрана и персонаж внутри него зачастую оказывается за пределами 4000-й координаты основной сцены.
Почему я не удаляю onEnterFrame для персонажа? Потому что он может стоять на другом персонаже или на предмете, который могут вытащить у него из-под ног, в итоге он должен опуститься ниже, до следующего персонажа или рельефа.
Сейчас можно мне надавать советов про подгрузку бэкграунда по частям и запихивание всех обработчиков онЭнтерФрейм в рут. Не нужно, все, что меня интересовало, я спросил в первом посте. :) Чингачгук меня успокоил. Да, видимо разработчики решили так же, как и любопытный Alex_beginner - что делать объектам за 4000-й координатой, и, чтобы не нагружать плеер, флэш за этой границей оперирует мувами исключительно как боундингБоксами.
chingachgoog
29.05.2008, 21:24
>>>>4096
...
Такая же картина с отрицательными значениями.
Отсюда вывод, для hitTest с флагом, координаты имеют ограничение в 16 бит + 1 бит на знак.
Все равно не ясно. Да, 4096*20 - это 17 разрядное число, НО не максимальное из 17-и разрядных!
Все равно не ясно. Да, 4096*20 - это 17 разрядное число, НО не максимальное из 17-и разрядных!Ну так и 2880 тоже не максимальное для своих разрядов, но тем не менее.
Почему я не удаляю onEnterFrame для персонажа? Потому что он может стоять на другом персонаже или на предмете, который могут вытащить у него из-под ног, в итоге он должен опуститься ниже, до следующего персонажа или рельефа.
Вам все равно придется удалять onEnterFrame, а если происходит какое-то событие, то тогда и нужно снова активировать onEnterFrame.
Хых, что значит "придется"? А кто меня заставит? ;)
Волгоградец
30.05.2008, 13:30
Тормоза заставят.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.