Просмотр полной версии : Своеобразный Redraw при использовании addChild
Y_Vitaly
09.06.2007, 20:34
Как, при, допустим, изменении размера Flash Player'a Shape (нарисованый скриптом) всегда находился в нижнем правом углу и не оставлял после себя след?
addChildAt и removeChild не подходит :( Дело в том, что есть класс, который рисует этот Shape, при изменении размера окна Flash Player'a рисуется новый Shape - по логике он должен автоматом убивать предыдущий и ложится на его место, ведь z-order остаётся постоянным.
DarkLight
09.06.2007, 20:54
а почему бы не сохранять ссылку на отрисованный Shape и не делать ему clear перед новой отрисовкой?
P S А когда-то я смеялся над паскальщиками на олимпиаде по программированию, когда у меня во флеше шарик летал, а у них в паскале оставлял за собой след:)
Y_Vitaly
09.06.2007, 21:23
А зачем ссылку? Ведь раньше с createEmptyMovieClip всё работало что там был мувик, что сейчас один и тот же объект… Может есть какой-то попроще выход? Shape то не один и все внутри разных Sprite'ов.
DarkLight
09.06.2007, 22:23
а почему нужно именно перерисовывать а не двигать?
Y_Vitaly
09.06.2007, 23:32
Потому-что Shape не растягивается и не увеличивается (если б так - то линии становились бы толстыми) - он просто перерисовывается под новый размер окна.
Советую выложить пример, так как не понятно что ты именно хочешь
Y_Vitaly
10.06.2007, 14:08
Непосредственно рисование:
// Create a Sprite, positioned at x:0 and y:0.
var topGUISprite:Sprite = new Sprite();
addChild(topGUISprite);
// Create a top GUI Shape.
var topGUIShape:Shape = new Shape();
topGUISprite.addChild(topGUIShape);
// Begin drawing top GUI.
// 1.
topGUIShape.graphics.beginFill(mainColor);
// x0, y0.
topGUIShape.graphics.moveTo(realX, realY);
topGUIShape.graphics.lineTo(realWidth, realY);
// 2.
topGUIShape.graphics.lineTo(realWidth, realHeight-25);
// 3.
topGUIShape.graphics.lineStyle(1, darkLine, 100);
topGUIShape.graphics.lineTo(realX, realHeight-25);
// 4.
topGUIShape.graphics.lineStyle(1, mainColor, 100);
topGUIShape.graphics.lineTo(realX, realY);
topGUIShape.graphics.endFill();
Обработчик события:
// Stage Listener.
stage.addEventListener(Event.RESIZE, resizeHandler);
function resizeHandler(event:Event) {
contentUpdater();
}
Внутри contentUpdater(); вызывается метод, тело которого описано выше.
Пример находится тут (http://idisk.mac.com/vitaly.yurchenko-Public)
проблема имхо только в том, что addChildAt не убивает находящийся на этой глубине объект (как было c createMovieClip или attachMovie)
не вижу почему в GUI не держать ссылки на все графические элементы, создать их в конструкторе, а в методах пересоздавать или перерисовывать, это уж как удобнее.. GUI.zip (http://silin.fatal.ru/trash/GUI.zip)
Timerlan
14.06.2007, 13:59
насколько я помню по мануалу ( если я его правильно понял), то addChildAt добавляя новый объект на какую-то глубину, переводит старый объект этой глубины на более высокий уровень. Там даже иллюстрации к этому есть
Y_Vitaly, отредактируйте свой пост и оформите код тегами .
Y_Vitaly
14.06.2007, 23:24
Спасибо всем, действительно создал в конструкторе ссылки и в методах с помощью graphics.clear стирал и рисовал заново.
Я так понял всё время создавался новый Sprite и Shape, что впринципе неразмуно, зато теперь понятно. Фича однако!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.