![]() |
ActionScript 3 с нуля
Извините если поднял ненужный вопрос - просто хотел бы создать топик в котором можно было бы сконцентрировать вопросы ну уж совсееем для тех кто не в теме.
При необходимости можете удалить тему... Ну так вот - тема AS3 относительно молодая. Это видно хотя бы потому что документаций и примеров по ней не так и много, можно сказать практически нет. но а что есть - не совсем понятно что для чего и откуда берётся. Если позволите я буду задавать совсем глупые вопросы - которые возможно бы пролили свет на то что происходит... итакс начну. Поставил 9ю версию флеша, настроил Паблик на AS3 и открываю окно программирования. первое что хочу сделать - написать 'Приветище мир!' пишу Код:
trace ("Приветище мир!");работает! натыкаюсь на пример в инете: Код:
package main { вот тут меня и понесло задавать вопросы... например что ещё за package? для чего нужна строчка ? import flash.display.Sprite; и что она означает ? как разобраться с классами если раньше с ними никогда не работал public class test1 extends Sprite { } тем более что слов много и непонятно что для чего и функция тоже public function test1() { } вроде как всё знакомо но непонятно какои образом она вызвалась, или как вызвался класс.... В общем совсем ничего не понятно.... я так же пытался почитать http://livedocs.adobe.com/flex/201/langref/index.html но там тоже только описание операторов, но простейших примеров как они работают нет. Догадайся мол сам =( |
по-моему тебе нужно начать с теории ООП, почитав Мука.
|
а ссылка есть? :)
или где купить кстати понятие классов и функций я имею, использовал их как в AS2 так и в PHP (было немного на DELPHI) но тут чё то немогу никак разобраться.... |
пошаманив немного с примерами - кое что стало немного ясно.
как известно поле Document class сделанно для того чтобы присвоить в него основной класс. в этом случае код класса пишется в отдельном *.as файле. а в Document class пишется путь к этому файлу. путь выглядит следующим образом main.fff.ggg где main это папка лежащая в той же директории где наш *.fla файл fff - папка лежащая в папке main, а ggg - это имя нашего файла *.as лежащая в папке fff. т.е. получается путь к ggg.as всё верно? (хотя остаются вопросы как перейти в другие уровни и т.д. - но до этого пока щас не дошёл). да ещё заметил что поле *.fla файла обязательно должно оставаться пустым - иначе возникает ошибка (даже если просто коментарий написать) - почему? То же самое касается и сцены - в ней тоже не должно ничего быть иначе вылезает ошибка. Второе что интересует как быть с встроенным программным полем fla ? там работают простые примеры типа trace(); математика, определение параметров объектов и т.д. А как например мне сделать autoSize к динамическому полю? http://livedocs.adobe.com/flex/201/l....html#autoSize |
|
А почему бы Вам сперва не прочитать статью многоуважаемого Мерлина http://www.timezero.ru/storm/page1.html, где на конкретном примере показано что, куда и зачем в AS3?
Тема с обсуждением так и называется: "Знакомство с Actionscript 3" и находится 10 строчками ниже. http://flasher.ru/forum/showthread.php?t=83431 |
пример с Timezero просто восхитителен!
Но архитектура не сразу ясна.... я же как раз и сравнивал изначально 2 примера - Hello World c timezero и свой старый бытовой. http://as3.ru/?p=14 - сильно похож на код с таймзеро (и кстати там я тоже откоментировался об небольшой поправке как DRAGON ) в таймзеро там некоторые мелочи опускают - вот я их и хотел бы уточнить. например что есть package main { } ? и как оно работает? из всего текста я полнял что import - это своего рода добавление библиотеки. (зачем такая сложность?) к тому же как я понял в SWF или плугине FLASH всёравно запускаются все эти библиотеки. |
package main всего лишь означает, что класс находится в пакете main и всё.
Если ты писал на AS2, то не понимаю, откуда такие вопросы возникают. |
> например что есть package main { } ?
> и как оно работает? см. здесь http://flasher.ru/forum/showpost.php...9&postcount=93 > из всего текста я полнял что import - это своего рода добавление библиотеки. да, http://flasher.ru/forum/showpost.php...6&postcount=86 > (зачем такая сложность?) этот вопрос меня тоже беспокоит :) теоретически Flash мог бы и сам найти нужные классы. Может для порядку? Как, например, ввели обязательно писать override при переопределении метода класса, чтобы случайно не заменить уже существующий. Так возможно и здесь, если ты не написал import а пытаешься использовать класс, так может это просто опечатка в имени класса? > к тому же как я понял в SWF или плугине FLASH всёравно запускаются все эти библиотеки. нет, в SWF будут встроены только те библиотеки, которые были указаны в import. Кстати еще один прикол, если включить Strict mode (http://flasher.ru/forum/showpost.php...postcount=101), написать в классе import чего-либо, что в классе не используется, то компилятор на это ругается, типа чего объявить объявил а не используешь, вот только текст ошибки сбивает с толку, там говорится не могу найти объявленный класс :) > как разобраться с классами если раньше с ними никогда не работал > public class test1 extends Sprite { } > тем более что слов много и непонятно что для чего про много слов см. тут http://flasher.ru/forum/showpost.php...66&postcount=9 > и функция тоже > public function test1() { } > вроде как всё знакомо но непонятно какои образом она вызвалась, Если функция названа так же как класс - это конструктор, который вызывается автоматически при создании класса > или как вызвался класс.... он был записан в поле Document class, см. тут http://flasher.ru/forum/showpost.php...0&postcount=77 > да ещё заметил что поле *.fla файла обязательно должно оставаться > пустым - иначе возникает ошибка (даже если просто коментарий написать) - почему? > То же самое касается и сцены - в ней тоже не должно ничего быть иначе вылезает ошибка. Потому что размещенные на сцене объекты будут встроены в рутовый класс (Document class) а если этот класс не объявлен как динамический (dynamic), то в него нельзя ничего динамически добавить, потому и возникает ошибка. Добавь слово dynamic в описание рутового класса и все будет ok. > Второе что интересует как быть с встроенным программным полем fla ? см. тут http://flasher.ru/forum/showpost.php...1&postcount=33 |
import в AS3 работает именно как импорт, т.е. зашивает всё-таки классы.
|
> import в AS3 работает именно как импорт, т.е. зашивает всё-таки классы.
Враньё :) он делает их видимыми :) ничего он не зашивает. проверял. неиспользуемые классы он не зашивал. >> (зачем такая сложность?) >этот вопрос меня тоже беспокоит тут всё проще у тя могут быть 2 класса с одинаковыми названиями, в разных пакетах. Практика конечно плохая, но впринципе может быть такая ситуация. |
Цитата:
И случаются совпадения в именах классах, можно конечно переименовать, но зачем придумывать глупые префиксы\постфиксы когда можно просто написать импорт. Хотя фасадным* классам, конечно стоит пытатся всегда придумывать уникальные имена. С утилитарными\внутреними классами фасады можно не церемонится. *Фасадный класс - объединяющий интерфейс нескольких классов для централизованного доступа, получается этакая инкапсуляция пакета или даже целой библиотеки. |
поидее пакет package может содержать в себе несколько классов, однако у меня что то не получилось. Я пытаюсь делать так:
есть text.fla и там в Document class прописываю parseXML содержимое parseXML.as: Код:
package { 5006: An ActionScript file can not have more than one externally visible definition: parseXML, ListItem как правильно делать? |
Один файл не может содержать два (и более) публичных класса.
Т.е. вообще несколько классов в один файл записать можно. Но из-за пределов файла должен быть видим только один. Вариант 1. Каждый класс - в отдельный файл. Это если обязательно надо сделать два или более публичных классов. Вариант 2. Одному классу пишешь public, всем остальным - private Это если дополнительные классы нужны только для внутренней реализации и никому больше знать про них не надо. В твоём случае, насколько я понимаю, лучше первый вариант, так как ты наверняка захочешь обратиться ListItem где-то ещё. |
См. директиву internal.
|
пытаюсь делать как вы советуете - но что то не получается. Вот 2 способа в одном
test.fla = пишу "Parse" содержимое Parse.as: Код:
package { Код:
package { Код:
private class Item {1013: The private attribute may be used only on class property definitions. если его закоментировать то ругаться перестаёт и вроде даже как цепляет второй класс.. однако текстфилд почему то не создаётся :o Ой т.е. текстфилд создаётся но я его не вижу почему то. |
такс, вторую ошибку решил - надо было просто догадаться передавать место куда addChild делать . Что-то типа этого
Код:
var vv:ListItem = new ListItem(this); |
решил проблему сам. просто надо было внимательней смотреть на пример
http://flasher.ru/forum/showpost.php...17&postcount=8 есть пакет есть главный класс в этом пакете.. ОСТАЛЬНЫЕ КЛАССЫ ПИСАТЬ ВНЕ ПАКЕТА! (т.е. после "package {}") - вот в чём я стормозил... =) |
подскажите пожалуйста если кто может ещё такую вещь, или совет дайте. А то совсем запутался.
Я хочу сделать свой класс прелоадер например и програмно в нём рисовать все элемнты, загрузку, текст и т.д. так вот, я хотелбы сделать свой класс похожий на MovieClip, то есть чтобы можно было менять координаты, давать ссылки , но не как обычно вызовом метода а напрямую. Это возможно? Код:
package { |
Конструктор класса не есть метод, возвращающий чего-либо.
Что помешало наследовать Item от MovieClip и рисовать всякую ботву прям в конструкторе? |
удалите копию сообщения пожалуйста а то сдублировалось что то :rolleyes:
Цитата:
Цитата:
Спасибо что то получилось :victory: буду копаться, на данный момент вопросов пока нету. |
ах да, забыл ещё вот что спросить.
пока рабочий код получился следующим Код:
package { можно его куда нить пихнуть 1 раз так, чтобы не package ни class Item не ругались? |
Нет, необходимо сделать это дважды.
|
ладненько - ещё раз спасипки :victory:
|
ещё такой вопрос созрел.
как известно в классе есть свои методы и параметры. мытоды вызывают внутренние функции которые что то делают. например Код:
var mc = new Item();Код:
public function addText(text:String) {Возможно ли сделать такой параметр, который бы работал как метод. т.е. писать не mc.setText('привет'); а mc.setText = 'привет'; (этот вопрос меня интересовал ещё с двойки) |
Нужно использовать сеттер.
Код:
public function set text(value:String):void {Код:
mc.text = 'hello'; |
вах! Здорово! Спасибо !!!
|
такой вопрос. Попробую объяснить понятно =)
есть некоторое клетчатое поле, в каждой клетке могут быть несколько мувклипов. само поле имеет 2.5D проекцию http://dragonnoid.ru/images/2.5D.JPG Так вот, на каждой клетке может быть по несколько мувклипов (пользователей обычно для FLASH-чата) сами мувклипы привязанны к двумерному массиву. 1) можно ли как то узнать самый верхний мувклип? и добавить новый поверх него или изменить текущий с его позицией 2) привязать как то положение мувклипов к координате Y так, чтобы выше был тот, чья координата Y меньше 3) может есть более логичный и лёгкий способ? :rolleyes: |
Я бы попробовал примерно вот такие глубины вложенности:
Код:
01 |
Новый мувик поверх всех добавляецца так:
Код:
this.addChild(this.item1); |
Цитата:
Код:
00 |
хочу спросить на счёт double Click
вот изначально рабочий код Код:
package { Код:
public function Item ():void {Код:
public function Item ():void { |
Cделай класс Item унаследованный от Sprite(), пихай туда все что хочешь, а потом:
Код:
var item:Sprite = new Item(); |
мне для упрощения работы хотелось сделать как раз второй вариант, но
второй вариант не сработал ни this.addEventListener(...); ни просто addEventListener(...); самый более меннее нормальный и рабочий вариант оставил первый, с той лишь разницей что делаю hit (с hit.alpha=0) Зону внутри Item() и на неё вешаю все Events. кстати ЛОЛ - я сделай класс Item унаследованный от Sprite(), но внутри была анимация (движение текста) всё работает Оо теперь вообще непонимаю в чём разница между MovieClip и Sprite (уже делал пост на эту тему но очевидных отличий так и не вижу), методы и свойства всё те же. |
У Sprite нет методов MovieClip и он меньше памяти потребляет.
|
Цитата:
кстати тут в тупик попал с этими слоями... дело в том что я хотел при нажатии на какой нить из Item(); делать его поверх всех остальных... однако делать это хотел из самого Item(); пока ещё думаю как это сделать... можно ли узнавать numChildren основного класса из Item(); ? |
Я говорю про методы play, stop, gotoAndStop и т.п.
Узнать numChildren можно обратившись к parent. |
я делал так (счас тожа пытаюсь програмить на ас3 с использованием флексовского фреймворка):создавал массив Item'ов добавлял их в основной класс, кажый Item хранит в себе индекс массива. А потом на mouseClick Item диспатчил Event где еще передавал свой индекс. Подписавшись на этот Event основной класс вытаскивал его поверх всех.
|
клёво! для будущего поколения напишу что получилось
1) чтобы узнать numChildren - достаточно внутри вызываемой функции побочного класса написать parent.numChildren 2) а чтобы узнать child номер слоя самого экземпляра (в моём случае Item()) достаточно написать parent.getChildIndex(this) а вот что в конечном счёте надо было мне Код:
parent.swapChildrenAt (parent.getChildIndex(this), parent.numChildren-1); |
Здравствуйте! Вот принёс ещё несколько вопросов, если позволите.. :rolleyes:
первое что интересует - я хочу задействовать колёсико мыши (или он же Scroll). За эту функцию отвечает MouseEvent.MOUSE_WHEEL. Хочу отслеживать на всей флешке, пишу: Код:
addEventListener(MouseEvent.MOUSE_WHEEL, m);Вот собственно и первый вопрос - как мне сделать нормальный MOUSE_WHEEL? Второе что интересует, так это всё та же больная тема с множеством муклипов на сцене :D самый хороший способ это создать массив: Код:
private var objects:Array = new Array();Код:
var key = objects.length;Нормальный способ самоудаления? или есть что по лучше? |
| Часовой пояс GMT +4, время: 00:33. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.