Просмотр полной версии : Програмное рисование adobe flash prof cs6
zomkoner
24.01.2013, 16:50
Подскажите пожалуйста учебники какие нибудь простенькие по програмному рисованию во флеше... мне особого много не надо просто в цикле создать н количество квадратов с округленными краями... заранее спасибо...
Используйте методы класса Graphics (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Graphics.html).
Используйте метод drawRoundRect класса Graphics (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Graphics.html#drawRoundRect()).
Если хотите почитать про программное рисование, то советую книгу Колин Мук "ActionScript 3.0 для Flash. Подробное руководство" (Часть II. Глава 25. Рисование с помощью векторов).
zomkoner
24.01.2013, 17:08
TWETTI, спасибо большое а если такую функцию:
function addElement(NumElement:int, HrefElement:String):void{
var YElement:int = ((NumElement / 3+1));
var YYElement:int = (YElement * 80);
var XElement:int = ((NumElement % 3) * 80);
trace (XElement);
trace (YYElement);
var shapes:Sprite = new Sprite();
addChild(shapes);
var gr:Graphics = shapes.graphics;
gr.lineStyle(3, 0x330066, .3);
gr.beginFill(0x330066, .3);
gr.drawRect(125,5,70,70);
gr.endFill();
shapes.x = XElement;
shapes.y = YYElement;
}
то нечего страшного что каждый раз создается спрайт с одинаковым именем? или лучше как то по другому сделать? а то я во флеше новичок, вообще не догоняю что да как...
Объясните, что должна делать эта функция?
zomkoner
24.01.2013, 17:20
да конечно:
функция принимает два значения ссылку и номер элемента...
addElement(NumElement:int, HrefElement:String)
в зависимости от номера мы определяем координаты квадрата...
квадраты должны стоять в 3 столбца на н количество строк...
var YElement:int = ((NumElement / 3+1));
var YYElement:int = (YElement * 80);
var XElement:int = ((NumElement % 3) * 80);
после определения координат мы должны нарисовать квадрат на сцене
var shapes:Sprite = new Sprite();
addChild(shapes);
var gr:Graphics = shapes.graphics;
gr.lineStyle(3, 0x330066, .3);
gr.beginFill(0x330066, .3);
gr.drawRect(125,5,70,70);
gr.endFill();
shapes.x = XElement;
shapes.y = YYElement;
да вроде всё работает, по крайне мере не с округленными краями, но я из документации одоба прочту метод и переделаю...
у меня вопрос такой, то что при каждом новом квадрате вызывается эта строка то это не страшно?
var shapes:Sprite = new Sprite();
и вот эта?
var gr:Graphics = shapes.graphics;
имена переменных то всегда одинаковые...
zomkoner
24.01.2013, 17:30
TWETTI, а объяснить поподробнее, что происходит не составит тебе труда? просто мне важно понять а не сделать! мне очень интересно что происходит с предыдущими, ведь они на сцене остаються всё равно, а их рано или поздно надо будет очистить со сцены, то как к ним обратиться?
zomkoner, Если в дальнейшем надо будет их удалить со сцены, то надо иметь ссылки на все Sprite'ы. Можете создать Sprite контейнер и добавлять в него другие Sprite'ы. Когда настанет время удалить их, просто напишите следующий код:
while (container.numChildren > 0) { container.removeChildAt(0); }
zomkoner
24.01.2013, 18:22
чего то всё равно не доходит что за контейнер! обычный сплайт в котором размещены другие?
нечего страшного что каждый раз создается спрайт с одинаковым именем?Это не имя. Вы создаете переменную (var) shapes, и записываете в нее ссылку на создаваемый спрайт (new Sprite()). Мало того, эта переменная является локальной для функции addElement, и ниоткуда больше не видна, только в теле самой функции, и исчезнет как только функция отработает. Но объект останется, просто на него нет явной ссылки. Однако, поскольку Вы добавили объект в другой объект-контейнер методом addChild(), у этого контейнера есть внутренняя ссылка на данный объект. И пока эта единственная ссылка продолжает жить, спрайт никуда не денется.
Но раз у Вас нет явной ссылки на этот спрайт, Вы не можете им распоряжаться напрямую, а только как ребенком контейнера, через методы контейнера. Например, если Вам известна глубина, на которой находится в контейнере этот спрайт, Вы можете получить на него явную ссылку и сохранить ее в переменной. Но это не всегда необходимо. Удалить объекты можно и перебором детей контейнера, или просто очистив весь контейнер методом removeChildren().
Так же ссылка на объект может быть получена из посланного им события.
чего то всё равно не доходит что за контейнер! обычный сплайт в котором размещены другие?
Да.
var container:Sprite = new Sprite();
container.addChild(sprite);// Добавление в контейнер других спрайтов
addChild(container);
zomkoner
24.01.2013, 18:59
спасибо всем большое... как оказалось всё просто! просто нужно создать контейнер за пределами функции, а в функции просто помещать другие сплайты с объектами! а можно прям в контейнер не сплайты добавлять а сразу объекты только но чтоб их было н количество?
Добавлено через 8 минут
всё уже нашел ответ использовать shape вместо sprite он занимает меньше памяти!
Добавлено через 44 минуты
вот помогите пожалуйста ещё разок. Вот та же но немного переделанная функция функция :
function addElement(NumElement:int, HrefElement:String):void{
var NumY:int = int(NumElement - 1);
NumY= int(NumY / 3 + 1);
var NumX:int = (NumElement - 1);
NumX = int(NumX % 3);
var XElement:int = (NumX * 80);
var YElement:int = (NumY * 80);
var shapes:Shape = new Shape();
conteiner.addChild(shapes);
shapes.graphics.lineStyle(2, 0x33CCCC, 90);
shapes.graphics.beginFill(0x99FFCC, 90);
shapes.graphics.drawRoundRect(XElement + 80,YElement,70,70,40);
}
вот я же делаю контуру и заливки прозрачность, а её нету((
shapes.graphics.lineStyle(2, 0x33CCCC, 90);
shapes.graphics.beginFill(0x99FFCC, 90);
почему?
в чём я заблуждаюсь? заранее спасибо!
Все работает.
import flash.display.Sprite;
var conteiner:Sprite = new Sprite();
addChild(conteiner);
function addElement(NumElement:int, HrefElement:String):void{
var NumY:int = int(NumElement - 1);
NumY= int(NumY / 3 + 1);
var NumX:int = (NumElement - 1);
NumX = int(NumX % 3);
var XElement:int = (NumX * 80);
var YElement:int = (NumY * 80);
var shapes:Shape = new Shape();
conteiner.addChild(shapes);
shapes.graphics.lineStyle(2, 0x33CCCC, 90);
shapes.graphics.beginFill(0x99FFCC, 90);
shapes.graphics.drawRoundRect(XElement + 80,YElement,70,70,40);
}
addElement(10,"");
У вас не работает наверно потому, что вы не добавили контейнер на stage.
Добавлено через 2 минуты
P.S. Именуйте переменные с маленькой буквы. У beginFill во втором параметре указывайте вещественное число от 0 до 1.
zomkoner
24.01.2013, 20:20
всмысле не добавил сцену?
addchild(conteiner);
так? добавил!
квадратики то есть а вот прозрачности контура нет((
Добавлено через 1 минуту
а всё, в обоих случаях надо было от нуля до единицы! спасибо!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.