PDA

Просмотр полной версии : Програмное рисование adobe flash prof cs6


zomkoner
24.01.2013, 16:50
Подскажите пожалуйста учебники какие нибудь простенькие по програмному рисованию во флеше... мне особого много не надо просто в цикле создать н количество квадратов с округленными краями... заранее спасибо...

bav
24.01.2013, 16:59
Используйте методы класса Graphics (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Graphics.html).

TWETTI
24.01.2013, 17:00
Используйте метод 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;

}

то нечего страшного что каждый раз создается спрайт с одинаковым именем? или лучше как то по другому сделать? а то я во флеше новичок, вообще не догоняю что да как...

TWETTI
24.01.2013, 17:12
Объясните, что должна делать эта функция?

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;
имена переменных то всегда одинаковые...

TWETTI
24.01.2013, 17:22
Ничего страшного.

zomkoner
24.01.2013, 17:30
TWETTI, а объяснить поподробнее, что происходит не составит тебе труда? просто мне важно понять а не сделать! мне очень интересно что происходит с предыдущими, ведь они на сцене остаються всё равно, а их рано или поздно надо будет очистить со сцены, то как к ним обратиться?

TWETTI
24.01.2013, 17:38
zomkoner, Если в дальнейшем надо будет их удалить со сцены, то надо иметь ссылки на все Sprite'ы. Можете создать Sprite контейнер и добавлять в него другие Sprite'ы. Когда настанет время удалить их, просто напишите следующий код:
while (container.numChildren > 0) { container.removeChildAt(0); }

zomkoner
24.01.2013, 18:22
чего то всё равно не доходит что за контейнер! обычный сплайт в котором размещены другие?

Wolsh
24.01.2013, 18:36
нечего страшного что каждый раз создается спрайт с одинаковым именем?Это не имя. Вы создаете переменную (var) shapes, и записываете в нее ссылку на создаваемый спрайт (new Sprite()). Мало того, эта переменная является локальной для функции addElement, и ниоткуда больше не видна, только в теле самой функции, и исчезнет как только функция отработает. Но объект останется, просто на него нет явной ссылки. Однако, поскольку Вы добавили объект в другой объект-контейнер методом addChild(), у этого контейнера есть внутренняя ссылка на данный объект. И пока эта единственная ссылка продолжает жить, спрайт никуда не денется.
Но раз у Вас нет явной ссылки на этот спрайт, Вы не можете им распоряжаться напрямую, а только как ребенком контейнера, через методы контейнера. Например, если Вам известна глубина, на которой находится в контейнере этот спрайт, Вы можете получить на него явную ссылку и сохранить ее в переменной. Но это не всегда необходимо. Удалить объекты можно и перебором детей контейнера, или просто очистив весь контейнер методом removeChildren().
Так же ссылка на объект может быть получена из посланного им события.

TWETTI
24.01.2013, 18:43
чего то всё равно не доходит что за контейнер! обычный сплайт в котором размещены другие?

Да.
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);
почему?
в чём я заблуждаюсь? заранее спасибо!

TWETTI
24.01.2013, 19:48
Все работает.
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 минуту
а всё, в обоих случаях надо было от нуля до единицы! спасибо!