PDA

Просмотр полной версии : ActionScript 3 с нуля


Страницы : [1] 2

DRAGOnoid
21.02.2007, 13:33
Извините если поднял ненужный вопрос - просто хотел бы создать топик в котором можно было бы сконцентрировать вопросы ну уж совсееем для тех кто не в теме.

При необходимости можете удалить тему...

Ну так вот - тема AS3 относительно молодая. Это видно хотя бы потому что документаций и примеров по ней не так и много, можно сказать практически нет.

но а что есть - не совсем понятно что для чего и откуда берётся.

Если позволите я буду задавать совсем глупые вопросы - которые возможно бы пролили свет на то что происходит...

итакс начну.
Поставил 9ю версию флеша, настроил Паблик на AS3 и открываю окно программирования.

первое что хочу сделать - написать 'Приветище мир!'
пишу
trace ("Приветище мир!");
жму Ctrl+Enter
работает!

натыкаюсь на пример в инете:

package main {
import flash.display.Sprite;

public class test1 extends Sprite {
public function test1() {
trace("Hello World");
}
}
}


пример взят отсюда http://www.timezero.ru/storm/

вот тут меня и понесло задавать вопросы...
например что ещё за package?
для чего нужна строчка ?
import flash.display.Sprite;
и что она означает ?

как разобраться с классами если раньше с ними никогда не работал
public class test1 extends Sprite { }
тем более что слов много и непонятно что для чего
и функция тоже
public function test1() { }
вроде как всё знакомо но непонятно какои образом она вызвалась, или как вызвался класс....
В общем совсем ничего не понятно....

я так же пытался почитать http://livedocs.adobe.com/flex/201/langref/index.html
но там тоже только описание операторов, но простейших примеров как они работают нет. Догадайся мол сам =(

baron27
21.02.2007, 13:37
по-моему тебе нужно начать с теории ООП, почитав Мука.

DRAGOnoid
21.02.2007, 13:56
а ссылка есть? :)
или где купить

кстати понятие классов и функций я имею, использовал их как в AS2 так и в PHP (было немного на DELPHI) но тут чё то немогу никак разобраться....

DRAGOnoid
21.02.2007, 17:25
пошаманив немного с примерами - кое что стало немного ясно.
как известно поле 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/langref/flash/text/TextField.html#autoSize

etc
21.02.2007, 17:47
Код в кадрах в девятом флеше не пишется.

http://as3.ru/?p=14

Dendroid
21.02.2007, 18:55
А почему бы Вам сперва не прочитать статью многоуважаемого Мерлина http://www.timezero.ru/storm/page1.html, где на конкретном примере показано что, куда и зачем в AS3?

Тема с обсуждением так и называется: "Знакомство с Actionscript 3" и находится 10 строчками ниже. http://flasher.ru/forum/showthread.php?t=83431

DRAGOnoid
21.02.2007, 21:04
пример с Timezero просто восхитителен!
Но архитектура не сразу ясна....
я же как раз и сравнивал изначально 2 примера - Hello World c timezero и свой старый бытовой.
http://as3.ru/?p=14 - сильно похож на код с таймзеро (и кстати там я тоже откоментировался об небольшой поправке как DRAGON )

в таймзеро там некоторые мелочи опускают - вот я их и хотел бы уточнить.
например что есть package main { } ?
и как оно работает?
из всего текста я полнял что import - это своего рода добавление библиотеки. (зачем такая сложность?) к тому же как я понял в SWF или плугине FLASH всёравно запускаются все эти библиотеки.

etc
21.02.2007, 21:32
package main всего лишь означает, что класс находится в пакете main и всё.

Если ты писал на AS2, то не понимаю, откуда такие вопросы возникают.

MerlinTwi
22.02.2007, 12:05
> например что есть package main { } ?
> и как оно работает?
см. здесь http://flasher.ru/forum/showpost.php?p=584029&postcount=93

> из всего текста я полнял что import - это своего рода добавление библиотеки.
да, http://flasher.ru/forum/showpost.php?p=583996&postcount=86
> (зачем такая сложность?)
этот вопрос меня тоже беспокоит :) теоретически Flash мог бы и сам найти нужные классы. Может для порядку? Как, например, ввели обязательно писать override при переопределении метода класса, чтобы случайно не заменить уже существующий. Так возможно и здесь, если ты не написал import а пытаешься использовать класс, так может это просто опечатка в имени класса?

> к тому же как я понял в SWF или плугине FLASH всёравно запускаются все эти библиотеки.
нет, в SWF будут встроены только те библиотеки, которые были указаны в import.
Кстати еще один прикол, если включить Strict mode (http://flasher.ru/forum/showpost.php?p=586006&postcount=101), написать в классе import чего-либо, что в классе не используется, то компилятор на это ругается, типа чего объявить объявил а не используешь, вот только текст ошибки сбивает с толку, там говорится не могу найти объявленный класс :)

> как разобраться с классами если раньше с ними никогда не работал
> public class test1 extends Sprite { }
> тем более что слов много и непонятно что для чего
про много слов см. тут http://flasher.ru/forum/showpost.php?p=572966&postcount=9

> и функция тоже
> public function test1() { }
> вроде как всё знакомо но непонятно какои образом она вызвалась,
Если функция названа так же как класс - это конструктор, который вызывается автоматически при создании класса

> или как вызвался класс....
он был записан в поле Document class, см. тут http://flasher.ru/forum/showpost.php?p=583450&postcount=77

> да ещё заметил что поле *.fla файла обязательно должно оставаться
> пустым - иначе возникает ошибка (даже если просто коментарий написать) - почему?
> То же самое касается и сцены - в ней тоже не должно ничего быть иначе вылезает ошибка.
Потому что размещенные на сцене объекты будут встроены в рутовый класс (Document class) а если этот класс не объявлен как динамический (dynamic), то в него нельзя ничего динамически добавить, потому и возникает ошибка. Добавь слово dynamic в описание рутового класса и все будет ok.

> Второе что интересует как быть с встроенным программным полем fla ?
см. тут http://flasher.ru/forum/showpost.php?p=576501&postcount=33

etc
22.02.2007, 12:21
import в AS3 работает именно как импорт, т.е. зашивает всё-таки классы.

BlooDHounD
22.02.2007, 13:54
> import в AS3 работает именно как импорт, т.е. зашивает всё-таки классы.

Враньё :) он делает их видимыми :) ничего он не зашивает. проверял. неиспользуемые классы он не зашивал.

>> (зачем такая сложность?)
>этот вопрос меня тоже беспокоит

тут всё проще у тя могут быть 2 класса с одинаковыми названиями, в разных пакетах. Практика конечно плохая, но впринципе может быть такая ситуация.

Nirth
24.02.2007, 08:49
этот вопрос меня тоже беспокоит теоретически Flash мог бы и сам найти нужные классы. Может для порядку? Как, например, ввели обязательно писать override при переопределении метода класса, чтобы случайно не заменить уже существующий. Так возможно и здесь, если ты не написал import а пытаешься использовать класс, так может это просто опечатка в имени класса?

По моему все логично, очень часто при разработке приложений используются third party компоненты\библиотеки, или банально куча разработчкиков (сейчас в проекте который я делаю, их несколько десятков).

И случаются совпадения в именах классах, можно конечно переименовать, но зачем придумывать глупые префиксы\постфиксы когда можно просто написать импорт.

Хотя фасадным* классам, конечно стоит пытатся всегда придумывать уникальные имена. С утилитарными\внутреними классами фасады можно не церемонится.

*Фасадный класс - объединяющий интерфейс нескольких классов для централизованного доступа, получается этакая инкапсуляция пакета или даже целой библиотеки.

DRAGOnoid
20.07.2007, 16:18
поидее пакет package может содержать в себе несколько классов, однако у меня что то не получилось. Я пытаюсь делать так:

есть text.fla и там в Document class прописываю parseXML

содержимое parseXML.as:
package {
import flash.display.MovieClip;
import flash.events.*;

public class parseXML extends MovieClip {

public function parseXML () {
trace ("привет");
}
}
class ListItem {
public function ListItem () {
trace ("хай!");
}
}



выдаёт ошибку
5006: An ActionScript file can not have more than one externally visible definition: parseXML, ListItem

как правильно делать?

WindWalker
20.07.2007, 16:43
Один файл не может содержать два (и более) публичных класса.
Т.е. вообще несколько классов в один файл записать можно.
Но из-за пределов файла должен быть видим только один.

Вариант 1. Каждый класс - в отдельный файл.
Это если обязательно надо сделать два или более публичных классов.

Вариант 2. Одному классу пишешь public, всем остальным - private
Это если дополнительные классы нужны только для внутренней реализации и никому больше знать про них не надо.


В твоём случае, насколько я понимаю, лучше первый вариант, так как ты наверняка захочешь обратиться ListItem где-то ещё.

etc
20.07.2007, 16:45
См. директиву internal.

DRAGOnoid
20.07.2007, 17:02
пытаюсь делать как вы советуете - но что то не получается. Вот 2 способа в одном

test.fla = пишу "Parse"

содержимое Parse.as:
package {
import flash.display.*;
//import flash.events.*;
//import flash.net.*;
//import flash.text.*;

import ListItem;

public class Parse extends MovieClip {
public function Parse() {
var vv:ListItem = new ListItem();
}
}
private class Item {
public function Item () {
trace ("хай!");
}
}
}

содержимое ListItem.as:
package {
import flash.display.*;
import flash.events.*;
import flash.text.*;

public class ListItem extends MovieClip {
public function ListItem () {
trace ("класс подцепился");
// создаю текстфилд
var formatter:TextFormat = new TextFormat();
formatter.font = "Comic Sans MS";
formatter.size = 14;

var field:TextField = new TextField();
field.selectable = false;
field.embedFonts = true;
field.defaultTextFormat = formatter;
field.setTextFormat(formatter);
field.text = "Matchiupichiu66666666666";
field.autoSize = TextFieldAutoSize.LEFT;
field.x = 10;
field.y = 10;
addChild(field);
trace (field);
}
}
}

в первом документе ругается на
private class Item {
public function Item () {
trace ("хай!");
}
}
и пишет
1013: The private attribute may be used only on class property definitions.

если его закоментировать то ругаться перестаёт и вроде даже как цепляет второй класс.. однако текстфилд почему то не создаётся :o Ой т.е. текстфилд создаётся но я его не вижу почему то.

DRAGOnoid
20.07.2007, 17:13
такс, вторую ошибку решил - надо было просто догадаться передавать место куда addChild делать . Что-то типа этого

var vv:ListItem = new ListItem(this);

package {
import flash.display.*;
import flash.text.*;

public class ListItem extends MovieClip {
public function ListItem (mc) {
---------------------\\-------------------
mc.addChild(field);
}
}
}


но второй класс в общий пакет так и не получилось вставить :(

DRAGOnoid
24.07.2007, 12:42
решил проблему сам. просто надо было внимательней смотреть на пример
http://flasher.ru/forum/showpost.php?p=572917&postcount=8

есть пакет есть главный класс в этом пакете.. ОСТАЛЬНЫЕ КЛАССЫ ПИСАТЬ ВНЕ ПАКЕТА! (т.е. после "package {}") - вот в чём я стормозил... =)

DRAGOnoid
24.07.2007, 13:37
подскажите пожалуйста если кто может ещё такую вещь, или совет дайте. А то совсем запутался.
Я хочу сделать свой класс прелоадер например и програмно в нём рисовать все элемнты, загрузку, текст и т.д.

так вот, я хотелбы сделать свой класс похожий на MovieClip, то есть чтобы можно было менять координаты, давать ссылки , но не как обычно вызовом метода а напрямую. Это возможно?

package {
import flash.display.*;
public class Parse extends MovieClip {
public function Parse() {
var mc:Item = new Item();
addChild(mc);
mc.x=100;
}
}
}
class Item {
import flash.display.*;

private var size:uint = 80;
private var bgColor:uint = 0xFFCC00;
private var borderColor:uint = 0x666666;
private var borderSize:uint = 0;
private var cornerRadius:uint = 9;
private var gutter:uint = 5;
public function Item ():MovieClip {//:void
trace ("хай!");
var mc = doDrawCircle();
return mc;
}
// просто рисую круг (взят из примера)
private function doDrawCircle():MovieClip {
var mc:MovieClip = new MovieClip();
var halfSize:uint = Math.round(size / 2);
var child:Shape = new Shape();
child.graphics.beginFill(bgColor);
child.graphics.lineStyle(borderSize, borderColor);
child.graphics.drawCircle(halfSize, halfSize, halfSize);
child.graphics.endFill();
mc.addChild(child);
return mc;
}
}
но при попытке написать public function Item ():MovieClip { выдаёт ошибку 1130: A constructor cannot specify a return type.. Почему?

etc
24.07.2007, 13:43
Конструктор класса не есть метод, возвращающий чего-либо.
Что помешало наследовать Item от MovieClip и рисовать всякую ботву прям в конструкторе?

DRAGOnoid
24.07.2007, 13:58
удалите копию сообщения пожалуйста а то сдублировалось что то :rolleyes:
Конструктор класса не есть метод, возвращающий чего-либо.
ухху - записал ;)
Что помешало наследовать Item от MovieClip и рисовать всякую ботву прям в конструкторе? ничто не помешало, наоборот я так и хотел. просто незнал как =)

Спасибо что то получилось :victory:
буду копаться, на данный момент вопросов пока нету.

DRAGOnoid
24.07.2007, 14:02
ах да, забыл ещё вот что спросить.
пока рабочий код получился следующим package {
import flash.display.*;

public class Parse extends MovieClip {
public function Parse() {
var mc = new Item();
addChild(mc);
mc.x=100;
}
}
}
import flash.display.*;
class Item extends MovieClip {
private var size:uint = 80;
public function Item ():void {
trace ("хай!");
var halfSize:uint = Math.round(size / 2);
var child:Shape = new Shape();
child.graphics.beginFill(0xFFCC00);
child.graphics.lineStyle(3, 0x666666);
child.graphics.drawCircle(halfSize, halfSize, halfSize);
child.graphics.endFill();
addChild(child);
}
}

но меня пока терзает тот факт что приходится в одном документе 2 раза вызывать import flash.display.*; :confused:
можно его куда нить пихнуть 1 раз так, чтобы не package ни class Item не ругались?

etc
24.07.2007, 14:05
Нет, необходимо сделать это дважды.

DRAGOnoid
24.07.2007, 14:06
ладненько - ещё раз спасипки :victory:

DRAGOnoid
24.07.2007, 14:25
ещё такой вопрос созрел.
как известно в классе есть свои методы и параметры.
мытоды вызывают внутренние функции которые что то делают.
например
var mc = new Item();
addChild(mc);
mc.setText('привет');
этот метод вызывает внутреннюю функцию, которая вставляет текст внутрь public function addText(text:String) {
this.txt.text = text;
}
(это просто пример - я конечно предполагаю что можно просто через public задавать параметры извне, но я другое хочу).
Возможно ли сделать такой параметр, который бы работал как метод. т.е. писать не mc.setText('привет'); а mc.setText = 'привет'; (этот вопрос меня интересовал ещё с двойки)

etc
24.07.2007, 14:38
Нужно использовать сеттер.

public function set text(value:String):void {
this.txt.text = value;
}

mc.text = 'hello';

DRAGOnoid
24.07.2007, 14:55
вах! Здорово! Спасибо !!!

DRAGOnoid
30.07.2007, 12:39
такой вопрос. Попробую объяснить понятно =)

есть некоторое клетчатое поле, в каждой клетке могут быть несколько мувклипов. само поле имеет 2.5D проекцию
http://dragonnoid.ru/images/2.5D.JPG

Так вот, на каждой клетке может быть по несколько мувклипов (пользователей обычно для FLASH-чата) сами мувклипы привязанны к двумерному массиву.
1) можно ли как то узнать самый верхний мувклип? и добавить новый поверх него или изменить текущий с его позицией
2) привязать как то положение мувклипов к координате Y так, чтобы выше был тот, чья координата Y меньше
3) может есть более логичный и лёгкий способ? :rolleyes:

miramax
30.07.2007, 13:10
Я бы попробовал примерно вот такие глубины вложенности:
01
02 03
04 05 06
07 08 09 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28

vapes
30.07.2007, 13:59
Новый мувик поверх всех добавляецца так:
this.addChild(this.item1);
this.addChild(this.item2);
this.setChildIndex(this.item1,this.numChildren-1);

DRAGOnoid
30.07.2007, 14:23
Я бы попробовал примерно вот такие глубины вложенности:
01
02 03
04 05 06
07 08 09 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28


да я когда прикидывал тоже был сначала склонен к этой системе, но более правильно делать так.

00
01 10
02 11 20
03 12 21 30
04 13 22 31 40
с такой системой работать на порядок легче! потому что в нумерации соблюдается двумерность, которую можно использовать как шахматное поле.

DRAGOnoid
31.07.2007, 13:22
хочу спросить на счёт double Click

вот изначально рабочий код
package {
import flash.display.*;
import flash.events.*;
public class Parse extends MovieClip {
public function Parse() {
var item:Item = new Item();
addChild(item);
}
}
}
import flash.display.*;
import flash.events.*;
class Item extends MovieClip {
private var roundRect:Sprite = new Sprite();
private var mc:Sprite = new Sprite();
public function Item ():void {
roundRect.addChild(drawRoundRect(0xEEEEEE));
roundRect.doubleClickEnabled=true;
roundRect.addEventListener(MouseEvent.DOUBLE_CLICK, onDblClick);
addChild(roundRect);
}
private function onDblClick(evt:MouseEvent):void {
trace("onDblClick");
}
private function drawRoundRect(color:Number):Shape {
var child:Shape = new Shape();
child.graphics.beginFill(color);
child.graphics.drawRoundRect(0, 0, 166, 23, 20);
child.graphics.endFill();
return(child);
}
}

но мне надо было сделать так (т.е. заставить работать на весь Item)
public function Item ():void {
roundRect.addChild(drawRoundRect(0xEEEEEE));
addChild(roundRect);
doubleClickEnabled=true;
addEventListener(MouseEvent.DOUBLE_CLICK, onDblClick);
}

я ещё пытался всё это засунуть в 1 мувклип тоже не получилось
public function Item ():void {
roundRect.addChild(drawRoundRect(0xEEEEEE));
mc.addChild(roundRect);
mc.doubleClickEnabled=true;
mc.addEventListener(MouseEvent.DOUBLE_CLICK, onDblClick);
addChild(mc);
}

как нужно делать правильно?

vapes
31.07.2007, 14:31
Cделай класс Item унаследованный от Sprite(), пихай туда все что хочешь, а потом:
var item:Sprite = new Item();
item.addEventListener(...)
если захочешь написать обработчик внутри, то пиши this.addEventListener(...);

DRAGOnoid
31.07.2007, 14:49
мне для упрощения работы хотелось сделать как раз второй вариант, но
второй вариант не сработал ни this.addEventListener(...);
ни просто addEventListener(...);

самый более меннее нормальный и рабочий вариант оставил первый, с той лишь разницей что делаю hit (с hit.alpha=0) Зону внутри Item() и на неё вешаю все Events.

кстати ЛОЛ - я сделай класс Item унаследованный от Sprite(), но внутри была анимация (движение текста) всё работает Оо теперь вообще непонимаю в чём разница между MovieClip и Sprite (уже делал пост на эту тему но очевидных отличий так и не вижу), методы и свойства всё те же.

etc
31.07.2007, 14:53
У Sprite нет методов MovieClip и он меньше памяти потребляет.

DRAGOnoid
31.07.2007, 16:34
У Sprite нет методов MovieClip и он меньше памяти потребляет.
Ну да я помню ты это писал. однако x, y, alpha, есть (и это хорошо, ачего нет то пока не использую) и даже анимацию крутить может...

кстати тут в тупик попал с этими слоями...
дело в том что я хотел при нажатии на какой нить из Item(); делать его поверх всех остальных... однако делать это хотел из самого Item(); пока ещё думаю как это сделать...

можно ли узнавать numChildren основного класса из Item(); ?

etc
31.07.2007, 16:35
Я говорю про методы play, stop, gotoAndStop и т.п.
Узнать numChildren можно обратившись к parent.

vapes
31.07.2007, 16:45
я делал так (счас тожа пытаюсь програмить на ас3 с использованием флексовского фреймворка):создавал массив Item'ов добавлял их в основной класс, кажый Item хранит в себе индекс массива. А потом на mouseClick Item диспатчил Event где еще передавал свой индекс. Подписавшись на этот Event основной класс вытаскивал его поверх всех.

DRAGOnoid
31.07.2007, 17:00
клёво! для будущего поколения напишу что получилось
1) чтобы узнать numChildren - достаточно внутри вызываемой функции побочного класса написать
parent.numChildren
2) а чтобы узнать child номер слоя самого экземпляра (в моём случае Item()) достаточно написать
parent.getChildIndex(this)

а вот что в конечном счёте надо было мне
parent.swapChildrenAt (parent.getChildIndex(this), parent.numChildren-1);

спасибо за помощь! =) копаю дальше....

DRAGOnoid
04.08.2007, 14:43
Здравствуйте! Вот принёс ещё несколько вопросов, если позволите.. :rolleyes:

первое что интересует - я хочу задействовать колёсико мыши (или он же Scroll). За эту функцию отвечает MouseEvent.MOUSE_WHEEL. Хочу отслеживать на всей флешке, пишу:
addEventListener(MouseEvent.MOUSE_WHEEL, m);
private function m (event:MouseEvent):void {
trace(event);
}
Ctrl+Enter = непашет. Думаю хмм.. что не так... поставил вместо MOUSE_WHEEL - MOUSE_DOWN, заработало но, только если я кликаю на какой то предмет (на пустоту неработает) ставлю обратно MOUSE_WHEEL. Хотя нигде MOUSE_DOWN не стоит, но MOUSE_WHEEL заработает только если ты хотя бы 1 раз тыкнешь на какой нить предмет (и причём неважно какой), тогда заработает.
Вот собственно и первый вопрос - как мне сделать нормальный MOUSE_WHEEL?

Второе что интересует, так это всё та же больная тема с множеством муклипов на сцене :D

самый хороший способ это создать массив:
private var objects:Array = new Array();
а потом просто добавлять предмет привязываясь к нему:
var key = objects.length;
objects[key] = new Item(key, 6, 30, 0.3, 0.1);
objects[key].x=600;
objects[key].y=130;
field.addChild(objects[key]);
как видно из куска кода я передаю экземпляру предмета key, однако это не спасает в случае когда надо предмету самоудалиться. Первый случай я вызываю общую функцию в общем классе и она удаляет предмет, элемент массива и циклом for each переписывает ключи во всех предметах в соответствиис новыми key массива.

Нормальный способ самоудаления? или есть что по лучше?

vapes
06.08.2007, 12:56
1. В самом первом классе попробуй написать
stage.addEventListener(...)
ну и соответственно обработчик к этому событию.
2. Я тоже сначала делал через массив, где каждый элемент хранил свой индекс, а потом подумал: а если у меня будет 2 массива, то и в одном и во втором будут элементы с одинаковыми индексами. Поэтому у меня сейчас все элементы хранят в себе свое уникальное имя и без массива.

DRAGOnoid
06.08.2007, 13:58
stage.addEventListener частично решил проблему...
скролл срабатывает всё ещё при клике, однако теперь срабатывает и на пустое место. (т.е. ненадо кликать специально на предмет)
может тут надо что то типа setScroll сделать где то? а то очень похоже на тот случай когда текстовое поле не активно пока ты его не активируешь (бональным кликом на него)

vapes
06.08.2007, 14:04
Зн я так понимаю скролл будет срабатывать, когда ты обьекту передашь фокус (кликнув по нему). Почитай че-нить про фокус и как его програмно передавать, потом и со мной поделишся :)

DRAGOnoid
06.08.2007, 14:39
оказывается проблема уже обсуждалась ранее на форуме
http://www.flasher.ru/forum/showthread.php?t=87721&highlight=focus
только я чё то не пойму как в нашем случае вызвать этот focus()

etc
06.08.2007, 14:45
С помощью JavaScript.

vapes
06.08.2007, 14:50
А если флешка локальная?

etc
06.08.2007, 14:52
А там такого не бывает.

15000

DRAGOnoid
06.08.2007, 15:24
с юбилеем ;)
вот у меня как раз в CS3 такое....
а как вообще теоретически включить этот focus() ?
я написал stage.focus; ошибки нет но и эффекта тоже.

etc
06.08.2007, 15:27
Если речь про работу в IDE, то это одно. Если не работает в окне standalone-плеера, то исходник в студию.

DRAGOnoid
06.08.2007, 17:34
вот наглядный пример :
рисует квадрат который по идее по скролу должен масштабироваться:

package {
import flash.display.*;
import flash.events.*;

public class Scale extends Sprite {
private var field:Sprite = new Sprite();

public function Scale() {
addChild(field);
field.addChild(doDrawRect());
stage.addEventListener(MouseEvent.MOUSE_WHEEL, m);
}
private function m (event:MouseEvent):void {
field.scaleX += 0.01*event.delta;
field.scaleY += 0.01*event.delta;
trace(event.delta);
}
private function doDrawRect():Shape {
var child:Shape = new Shape();
child.graphics.beginFill(0x0066FF);
child.graphics.lineStyle(2, 0xCCCCCC);
child.graphics.drawRect(0, 0, 100, 100);
child.graphics.endFill();
return(child);
}
}
}
масштабируется только при клике.

etc
06.08.2007, 17:57
Я уже говорил, что это исключительно в IDE такая ситуация. В standalone-плеере работает сразу и без кликов.

DRAGOnoid
10.08.2007, 18:32
есть TextField, можно ли в него как нибудь аттачнуть объект из библиотеки? (на подобие тега "<img>" в htmlText)

пример:

var textValue:TextField = new TextField();
textValue.htmlText = "скажи <img src=\"test.jpg\" width=\"100\" height=\"100\"> чего нить <font color=\"#FF0000\">приятное</font> <br>а ????";

только вместо img аттачить мувклип или спрайт из библиотеки...

etc
10.08.2007, 18:40
Да, указать в качестве параметра src класс картинки (не проверял, но вроде так).

DRAGOnoid
10.08.2007, 18:46
не что то не получается
"my_text.htmlText = "скажи <img src=\"Tea()\">";

ругается
Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found.
(чего то нехватает)

etc
10.08.2007, 18:47
Скобки нужно убрать.

DRAGOnoid
10.08.2007, 18:58
эээээ а почему перестала грузиться картинка? Оо (место резервирует а картинки нет та что 100х100)

my_text.htmlText = "скажи <img src=\"Tea\"width=\"40\" height=\"20\">!!!!!<img src=\"test.jpg\" width=\"100\" height=\"100\"> чего нить <font color=\"#FF0000\">приятное</font> <br>а ????";

derhab
10.08.2007, 19:47
а у тебя у текстфилда wordWrap=true?

etc
10.08.2007, 19:49
DRAGOnoid, код оформите.

DRAGOnoid
10.08.2007, 19:55
извините что намудрил (точнее много даю)
вот полный пакет простенького окошка что я и пытаюсь сделать, внутри хочу грузить текст с картинками :quiet:
package {
import flash.display.*;
import flash.events.*;

public class SHkitchen extends Sprite {
// массив объектов - мувклипов
private var objects:Array = new Array();
private var field:Sprite = new Sprite();

public function SHkitchen() {
trace ("привет");
var window = new TextForProject();
window.x = 300;
window.y = 20;
addChild(window);
}
}
}

// класс космического объекта
import flash.display.*;
import flash.events.*;
import flash.text.*;

class TextForProject extends Sprite {
public function TextForProject() {
//var mm = new Ggg();

var my_text:TextField = createTextField(200);
my_text.htmlText = "скажи <img src=\"Tea\" width=\"40\" height=\"20\">!<br><img src=\"test.jpg\" width=\"100\" height=\"100\"><br>!";

var my_shape:Shape = drawRoundRect(200+20, my_text.height+20);
addChild(my_shape);
addChild(my_text);

//addChild(mm);
}
private function createTextField(width:Number):TextField {
// формат
var textFormat:TextFormat = new TextFormat();
textFormat.bold = true;
textFormat.font = "Comic Sans MS";
textFormat.size = 20;
textFormat.color = 0x009900;

var textValue:TextField = new TextField();
textValue.x = 10;
textValue.y = 10;
textValue.width = width;
textValue.defaultTextFormat = textFormat;
textValue.autoSize = TextFieldAutoSize.LEFT;
textValue.multiline = true;
textValue.wordWrap = true;
textValue.selectable = false;
return textValue;
}
private function drawRoundRect(width:Number, height:Number):Shape {
var child:Shape = new Shape();
child.graphics.beginFill(0xFFFFFF, 0.9);
child.graphics.lineStyle(2, 0xDD0000);
child.graphics.drawRoundRect(0, 0, width, height, 20);
child.graphics.endFill();
child.name = "fon";
return(child);
}
}
// для теста
class Ggg extends Sprite {
public function Ggg() {
var my_shape:Shape = drawRoundRect(100, 100);
addChild(my_shape);
}
private function drawRoundRect(width:Number, height:Number):Shape {
var child:Shape = new Shape();
child.graphics.beginFill(0xFFFFFF, 0.9);
child.graphics.lineStyle(2, 0xDD0000);
child.graphics.drawRoundRect(0, 0, width, height, 20);
child.graphics.endFill();
child.name = "fon";
return(child);
}
}

кстатим последний класс я тоже попытался вставить как
my_text.htmlText = "скажи <img src=\"Ggg\">";
не получилось T_T

vapes
13.08.2007, 13:20
внутренние классы ни разу не ставил, а вот так прокатывало:
<img src=\"Tea.swf\" width=\"40\" height=\"20\">
во флексе прокатывает, если делаешь embed мувика а потом:
myImage.source = myEmbedClass;
или так :
<mx:Image x="0" y="0" source="@Embed('data/1.swf')"/>

Torero
14.08.2007, 03:39
Думаю, что вопрос как-раз для этой темы.. (Модераторам: может стоит "AS3 для начинающих" в отдельную ветку форума выделить?)
Пытаюсь открыть xml, расположенный на жестком диске в ответ на что получаю ошибку:
1046: Type was not found or was not a compile-time constant: Event.
Вроде все делаю "по Фэн-Шую" (http://flasher.ru/forum/showpost.php?p=575519&postcount=30). Подскажите пожалуйста: в чем ошибка?

etc
14.08.2007, 09:40
Забыл прописать импорт flash.events.Event

DRAGOnoid
21.08.2007, 19:06
со странной задачкой пришлось столкнуться по XML

хочу запарсить XML внутри которого CDATA с HTML тегами. короче сам XML загружаю из файла:
<?xml version="1.0" encoding="windows-1251"?>
<body>
<![CDATA[ проверка теговых символов - < > /> /\ \\ // << >> “ “ ‘’’’’’’ ]]>
<test/>
</body>

так вот уже когда я его уже парсю
trace("данные файла " + event.target.data);
var my_xml:XMLDocument = new XMLDocument();
//my_xml.ignoreWhite = true;
my_xml.parseXML(event.target.data);
trace("данные XML " + my_xml);

на выходе получаю слегка подпорченные данные:
данные файла <?xml version="1.0" encoding="windows-1251"?>

<body>

<![CDATA[ проверка теговых символов - < > /> /\ \\ // << >> “ “ ‘’’’’’’ ]]>

<test/>

</body>

данные XML <?xml version="1.0" encoding="windows-1251"?>

<body>

проверка теговых символов - &lt; &gt; /&gt; /\ \\ // &lt;&lt; &gt;&gt; “ “ ‘’’’’’’

<test />

</body>

как это обойти?

etc
21.08.2007, 19:08
CDATA просто не отображается.

vapes
21.08.2007, 19:32
а, если сделать:
myTextField.htmlText = my_xml
то скорей всего ничего не испортицца :quiet:

DRAGOnoid
22.08.2007, 15:37
а, если сделать:
myTextField.htmlText = my_xml
то скорей всего ничего не испортицца :quiet:
да будет показан HTML код как есть.. но надо то не код показывать а теги обрабатывать!

CDATA просто не отображается.
как это понимать ? Оо

etc
22.08.2007, 15:39
Чтобы получить нормальное значение нода, нужно использовать nodeValue (в случае с XMLDocument, хотя я бы использовал все-таки XML и E4X).

DRAGOnoid
22.08.2007, 15:49
да я сам бы использовал если бы знал как :rolleyes:

можешь чуток подробней написать как мне правильно загрузить XML и вытащить оттуда нод с CDATA?

DRAGOnoid
22.08.2007, 16:15
ура получилось!
var my_xml:XMLDocument = new XMLDocument();
my_xml.ignoreWhite = true;
my_xml.parseXML(event.target.data);
trace(my_xml.childNodes[0].childNodes[0].nodeValue);

но ты вроде говорил что лучше использовать XML а не XMLDocument
а как мне считать данные нода? А то не получается у меня что то

var my_xml:XML = new XML(event.target.data);
trace(my_xml.childNodes[0].childNodes[0].nodeValue);

выдаёт тонну ошибок =(

etc
22.08.2007, 16:17
Прочитай про nodeValue.

derhab
22.08.2007, 22:40
var my_xml:XML = new XML(event.target.data);
trace(my_xml.childNodes[0].childNodes[0].nodeValue);
выдаёт тонну ошибок =(

А отуда у класса ХМL childNodes? Это свойсто теперь только у XMLDocument вроде...

Ieshua
24.08.2007, 11:14
А отуда у класса ХМL childNodes? Это свойсто теперь только у XMLDocument вроде...
Все верно, оно теперь только у XMLDocument'а, который наследовал это свойство от XMLNode :away:

DRAGOnoid
27.08.2007, 14:04
что то захворал с parenta'ами

создаю два класса которые унаследую от класса Sprite.
в экземпляр одного создаю экземпляр другого, и этот внутренний методом parent пытается вызвать свойство или метод основного экземпляра.

вот код
package {
import flash.display.*;

public class SHkitchenTest extends Sprite {
public var testVar:Number;
public var test:Test;
public function SHkitchenTest() {
this.testVar = 5;
this.test = new Test();
addChild (this.test);
}
}
}

import flash.display.*;

class Test extends Sprite {
public function Test():void {
trace ("!"+parent.testVar);
}
}

выдаёт ошибку 1119: Access of possibly undefined property testVar through a reference with static type flash.display:DisplayObjectContainer.

что то я шаманил по этому поводу но ничего не получилось, а в хелпе про парент везде писали немного по другому.

помогите пожалуйста разобраться как правильно юзать parent :rolleyes:

etc
27.08.2007, 14:13
Ну естесственно, откуда у него parent в момент создания? parent будет только после addChild, а конструктор уже выполнился.

DRAGOnoid
27.08.2007, 14:36
эммммм
package {
import flash.display.*;

public class SHkitchenTest extends Sprite {
public var testVar:Number;
public var test:Test;
public function SHkitchenTest() {
this.testVar = 5;
this.test = new Test();
addChild (this.test);
this.test.test2();
}
}
}

import flash.display.*;

class Test extends Sprite {
public function Test():void {
}
public function test2() {
trace ("!"+parent.testVar);
}
}

эффект тот же :(

DRAGOnoid
27.08.2007, 15:18
очень странно получилось решить проблему.

просто, незнаю почему, решил кое что подправить и получилось докопаться до переменных основного конструктора:

package {
import flash.display.*;
import flash.system.*;

public class SHkitchenTest extends Sprite {
public var testVar:Number;
public var test:Test;
public function SHkitchenTest() {
this.testVar = 5;
this.test = new Test();
addChild (this.test);
trace (this.testVar);
this.test.test2();
}
}
}

import flash.display.*;

class Test extends Sprite {
public function Test():void {
trace ("Test 1) "+this.parent);
}
public function test2() {
// так не работает
//trace ("Test 2) "+this.parent.testVar);
// а так работает
trace ("Test 2) "+this.parent['testVar']);
}
}

а чтобы вызвать метод придётся писать так
trace ("Test 2) "+this.parent['testVar']());

вот теперь сижу и гадаю в чём прикол?


:boredom:

etc
27.08.2007, 15:26
Потому что parent — DisplayObjectContainer.

DRAGOnoid
27.08.2007, 20:04
пытаюсь задействовать
import fl.managers.FocusManager;
но мне выдаётся ошибка
1172: Definition fl.managers:FocusManager could not be found.
что с этим делать?

etc
27.08.2007, 20:10
Это во Flash CS3? Собственно, нужно хотя бы один из компонентов CS3 положить в либу.

DRAGOnoid
28.08.2007, 12:17
Это во Flash CS3? Собственно, нужно хотя бы один из компонентов CS3 положить в либу. на заморских сайтах так же ответили. А собственно что и куда положить то?

etc
28.08.2007, 12:23
Гм, я, кажется, по-русски написал, что и куда :D

DRAGOnoid
28.08.2007, 12:46
просто не совсем понял каких именно компонентов CS3 в какую либу?
Для меня понятие либа - (от англ слова library - библиотека) больше направляет на то, что вызывается внутри редактора сочетанием Ctrl+L. Но тут, я так понимаю имеются в виду *.as файлы, лежащие в какой-то папке, которые нужно скопировать куда-то. Вот я и хочу уточнить что и куда. А что касается сочетания "компоненты CS3" так тут вообще можно подразумевать что угодно :(. Это ж пост "Action Script 3 с нуля" тут не всем привычны и понятны такие "страшные слова" =). И я не исключение. Уж простите.

etc
28.08.2007, 12:54
Нет, имеется ввиду именно библиотека Flash CS3-документа. А компоненты — это то, что открывается по Ctrl+F7 (Cmd+F7 на маке).

DRAGOnoid
28.08.2007, 13:16
ясно - спасибо. Это кстати ответило на мой вопрос почему у меня в кое-каком месте сработал focus, я ещё подумал глюк какой.

DRAGOnoid
19.09.2007, 00:15
есть событие MouseEvent.MOUSE_WHEEL которое позволяет отследить кручение колёсика мышки. А как отследить клик колёсика? Если такое вообще реально?

etc
19.09.2007, 00:21
Это CLICK или MOUSE_DOWN.

DRAGOnoid
19.09.2007, 00:24
__etc ты когда нить спишь? =)
Не, ни CLICK ни MOUSE_DOWN не помогли - они срабатывают только при обычном клике левой клавиши мыши. Ну или я что то упустил.

etc
19.09.2007, 01:09
Попробуй KEY_DOWN тогда. Теоретически это отловить можно, например, в том же AS1/AS2 можно.

DRAGOnoid
19.09.2007, 01:45
да как раз про это читал.... в этом топике (http://www.flasher.ru/forum/showthread.php?t=83447&highlight=%EA%EE%EB%E5%F1%EE+%EC%FB%F8%E8)

делаю просто

...
{
stage.focus = this;
stage.addEventListener(KeyboardEvent.KEY_DOWN, k);
}
private function k (event:KeyboardEvent):void {
trace ("!"+event.keyCode);
}


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

etc
19.09.2007, 02:02
Наверное только то, что лучше тестировать не в IDE, а просто в плеере.

DRAGOnoid
19.09.2007, 02:10
Наверное только то, что лучше тестировать не в IDE, а просто в плеере.

мда - будем ждать 10й не глючной версии IDE =)
а то без него с трейсом полный облом.

в общем клавиши заработали а вот мышку пока так и не поймал :o

хотя по логике должно было вернуть код клавиш что то типа 1, 2, 4

etc
19.09.2007, 02:13
В IDE надо отключать Keyboard Shortcuts.

DRAGOnoid
19.09.2007, 02:33
как я понял для ловли мыши требуется недокументированная возможность ASnative, как её включить в AS3 я так и не понял. Зато понял что даже если и включить - есть вероятность что с выходом 10го плеера она будет неработать.

короче по ходу придётся забить. А жаль! Обычное колесо мало.
а возможности юзать мыш по пальцам перечесть
Click
DoubleClick
Ctrl+Click
ALT+Click
SHIFT+Click
Ctrl+Alt+Click
(ALT+SHIFT и Ctrl+Shift не хочу рисковать с глюком раскладки клавиатуры)

маловато будет =)

BlooDHounD
19.09.2007, 12:55
а у меня 3 руки и на каждой по 7 пальцев. я вообще не могу работать на стандартных мышках. мне на заказ делают специальные мышки с 45 кнопками.

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

etc
19.09.2007, 13:06
Это, сложно представить мышку, у которой нету третьей кнопки. :)

DRAGOnoid
19.09.2007, 14:42
да то что есть мышки с 20ю кнопками это понятно - и к тому же для них свои драйвера есть и вообще можно задействовать любое сочетание клавиш... это удобно в играх использовать когда порой даже всей клавиатуры не хватает....

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

например уже как то в привычку вошло управлять 3D камерой через левую и правую кнопку мыши.

управлять объектами не твойным а одинарным кликом, а свойства смотреть через правую клавишу..
побочные свойства используются клавишами CTRL ALT SHIFT.
А во флеше получается кроме левой клавиши то и нет то ничего..

кстати ещё почему плохо задействовать клавиатуру - например стоит задача сделать игру на КПК - а там мягко говоря не удобно будет играть в такую без клавы....

вот и получается что круг возможностей сократился до минимума этак 6 операций с мышью =(

и то это неудобно! (надеюсь таки позволят в будущем во флеше использовать правую клавишу мыши)

Kikasso
19.09.2007, 15:13
Это, сложно представить мышку, у которой нету третьей кнопки. :) Есть такая красная пимпочка на ноутах. Да и на тачпаде у меня нет.

BlooDHounD
19.09.2007, 16:48
всё очень просто. чем больше требования к продукту со стороны разработчика, тем меньше у него аудитория.
всегда надо делать альтернатвные элементы управления.

клава и все кнопки мышки, кроме левой - всего ли ш добавачный инструмент для хардкорщиков.

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

кароче. деньги надо научиться считать, прежде чем садиться разрабатывать что-либо.

даже в современных 3д шутарах можно настроить всё таким образом что бы управление было только мышкой. даже движение перса.

DRAGOnoid
19.09.2007, 19:31
шутеры на КПК вообще чит. По сути от шутеров много ненадо - только стрелки вперёд назад влево вправо и левая клавиша. оружие переключать каким нить табом , с альтернативным огнём только сложности будут без правой кнопки мыши то, а если поставить двойной клик сам понимаешь что получится.

а ещё хуже со стратегиями , а ещё хуже с 3D стратегиями =)
а вообще хуже всего с 3D MMORPG - где одних скилов штук 20 и оружий 50 )
и как это всё мышкой управлять (у которой только одна левая клавиша? =)

BlooDHounD
19.09.2007, 22:14
причём тут КПК? я вообще про разработку приложений.

ты внимательно читал мой пост?

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

нада давать пользователю свободу. а обязывать его использовать больше чем позволяет стилос - неэтично и экономически не выгодно.

DRAGOnoid
20.09.2007, 10:44
о том и реч. Я говорю что тоже с тобой согласен, что в других приложениях всё гораздо проще и как ты сам говоришь удобно использовать клаву и 2 кнопки мыши. А на счёт КПК я имел ввиду что там так дело не прокатит. Я же не на С++ разрабатываю а на флеше - ведь так? Вот и получается что так же круто как везде - технически не получится круто сделать у себя :(

ладно от темы что то как то ушли =) попробую что нить сделать сначала а потом думать. А пока вопросов не имею - спасибо за советы :)

BlooDHounD
20.09.2007, 13:41
я говорю о том что прикручивать кнопки это дело 3е. сперва надо сделать что бы функционировало всё с мышкой/стилосом/точпадом и одной левой кнопкой.

riden
21.09.2007, 00:24
А как отследить клик колёсика? Если такое вообще реально?
Вообще то есть кое-какой способ реализации обработки нажатия третьей кнопки мыши и правой кнопки мыши в AS3.
В AS3 мувик грузится AVM1 (мувик с AS2 кодом) - RightClickAVM1.swf.
RightClickAVM1.swf содержит код на AS2:
//псевдо-код
var bd:BitmapData = new BitmapData(1,1,false,0xF);
{добавляем bd на сцену}
for(var i:int=0;i<n;i+=1){
if(Key.isDown(i)){ меняем цвет bd на 0xi }
}

В AS3 мувике - допустим следующий код:
//псевдо-код
loader.load(RightClickAVM1.swf);//AVM1
...................................................
var avm1:AVM1Movie = loader.content;
var bd:BitmapData = new BitmapData();
bd.draw(avm1);//перерисовка работает мгновенно, ибо BitmapData перерисовывает BitmapDat-у
..........................
анализируем цвет bd и узнаем какая клавиша была нажата
...........................

Я то это не пробывал. Но думаю работает.
У меня есть подозрения, что класс Key в AS2 может слушать любые устройства ввода (джойстики). Ведь он слушает все клавиши мыши.
Никто не пробовал (джойстики)? //обратите внимание Key.isDown(i) - читает все, а Key.getCode() - возвращает только клавиши клавиатуры (и то не все).

etc
21.09.2007, 00:36
riden, мегакод, но, как бы, есть нечто получше (http://etcs.ru/blog/as3/globalmouse/). Правда, не совсем то, но из этой же оперы.

riden
21.09.2007, 01:56
Не, я пишу про правую клавишу мыши и клик колесика в AS3.
Можно вместо этого
for(var i:int=0;i<n;i+=1){
if(Key.isDown(i)){ меняем цвет bd на 0xi }
}
вот это:
//псевдо-код
if(Key.isDown(2)){меняем цвет bd на 0x2//правая кнопка}
if(Key.isDown(4)){меняем цвет bd на 0x4//средняя кнопка}
}

А for я привел, так как считаю, что возможно Key слушает джойстики тоже. //проверить немогу

etc
21.09.2007, 02:01
Я имел ввиду, что делать битмап и определять цвет клипа — изврат. Есть же нормальный вариант с LocalConnection и без необходимости загрузки swf извне, я его привел.

DRAGOnoid
24.09.2007, 17:47
возник ещё вопрос из ряда "на засыпку".
Допустим мы программно что-то рисуем, создаём класс Sprite или класс унаследованный от него.
например
this.menuWindow = new MenuWindow();
затем мы добавляем его на сцену
addChild(this.menuWindow);

Чтобы удалить дисплей объект мы используем removeChild. В этом случае у нас удаляеттся только вид объекта но не сам объект. Это хорошо. Но у нас остался тот же visible=false. Который действует почти так же.
Вот и спрашивается в каких случаях лучше использовать removeChild а в каких visible=false, в чём их разница, и что вообще можете посоветовать по этому поводу?

DRAGOnoid
24.09.2007, 17:54
блин сам подумал и понял одну вещь =]
при removeChild - не будет доступов типа parent. =]

но всёравно хотел бы ещё ваши мнения послушать

BlooDHounD
24.09.2007, 18:20
Работа с объектом при visible=false остаётся точно такой же. граници родителя считаются с учём клипа и т.д. при visible=false объект остётся дитём парента и учавствует во всех операциях, а так же, если надо постоянно показывать и прятать предмет, лучше использовать visible=false, так как это быстрее.

DRAGOnoid
24.09.2007, 19:38
спасибо =)

DRAGOnoid
04.10.2007, 12:52
подскажите пожалуйста такой момент.
У меня на главной сцене есть несколько предметов, им даны разные имена.
Я гружу XML в котором содержатся эти имена (таким образом нахожу для кода нужные предметы)

но бывает либо опечатка редактора либо просто звёзды не так встали и в XML кто то написал название несуществующего предмета.

короче возникает ошибка
ReferenceError: Error #1069: Property ovoshi3 not found on kitchen and there is no default value.

как мне проверить существует ли такой предмет по имени?
я делаю это так - но почему то не срабатывает

for each (var item in xml.items.children()) {
if (this[item.name()]!=null)
trace (this[item.name()]);
}

etc
04.10.2007, 12:53
hasOwnProperty

DRAGOnoid
04.10.2007, 13:29
спасибо!!! *__*

DRAGOnoid
13.10.2007, 16:24
может есть смысл прикрепить эту тему? :rolleyes:
а то я частенько её кидаю своим подаванцам :umnik2: , а искать её всё сложнее :(

DRAGOnoid
16.10.2007, 13:49
спасибо что прикрепили - реально помогает!:victory:

у меня тут новая трудность - немогу решить.

ситуация такова. есть один единственный SWF в котором в библиотеке забиты классы спрайтов (предметов)

эти предметы могут быть а могут небыть..
их имена я подгружаю из XML. дальше по этим именам ищю такое свойство в главном классе и создаю объект.

но есть пара странностей - уже на первичном классе немогу без глюков определить есть ли класс в библиотеке.

вот как я делаю
trace (bread); // выдаёт [class bread]
trace (this.hasOwnProperty(bread)); // выдаёт false Оо
// ладно способ 2
trace (getDefinitionByName('bread')); // выдаёт [class bread]
// однако
// trace (getDefinitionByName('bread2'));// ReferenceError: Error #1065: Variable bread2 is not defined.
// объединяю
trace (this.hasOwnProperty(getDefinitionByName('bread')));// выдаёт false Т_Т

что делать? :(

etc
16.10.2007, 13:54
Ну правильно выдает false.
Во-первых, ты передаешь не строковое значение в hasOwnProperty. Во-вторых, для того, чтобы определить, есть ли класс, можно использовать loaderInfo.applicationDomain.hasDefinition().

DRAGOnoid
16.10.2007, 14:09
а hasOwnProperty - на какие свойства работает? я так понял на классы нет - потому что так тоже не пашет
trace (this.hasOwnProperty('bread')); // выдаёт false Оо

спасибо - this.loaderInfo.applicationDomain.hasDefinition('bread') - прикрасно заработал.

а ещё я вспомнил метод молотка и мата на любой случай жизни )
это обычный try =))

вот ещё вопрос - могу ли я как нибудь из конструктора любого класса или подкласса - получить свойства основного класса или главного Stage, без переносса ссылок ?

т.е. мне например хочется узнать из под-под-под.... класса Stage.stageWidth для ресайза...
или добавить общий клик.
можно ли как то обойти перенос ссылок с помощью переменных?

etc
16.10.2007, 14:30
Естесственно, у this нет свойства bread.

Остальное не понял.

DRAGOnoid
16.10.2007, 14:39
есть основной класс

package KitchenClasses {
import flash.display.*;
import flash.events.*;

public class MenuWindow extends Sprite {
public function MenuWindow ():void {
trace (Stage.stageWidth); // выдаст например 500
var test = new Test(this);
}
}
}

import flash.display.*;
import flash.events.*;

class Test {
public function test(Parent:Object):void{
trace (Parent.Stage.stageWidth); // выдаст например 500
trace (Stage.stageWidth); // выдаст ошибку}
}

etc
16.10.2007, 14:45
У класса Stage нет статического свойства stageWidth.

2morrowMan
16.10.2007, 16:55
Не Stage, а stage.
if (this.stage)
trace(this.stage.stageWidth);

etc
16.10.2007, 18:04
Более того, stage доступен только у наследников DisplayObject. Причем после добавления в display list.

BlooDHounD
16.10.2007, 22:26
hasOwnProperty - определяет, если ли публичное свойство с переданным имененм.

а получать свой стэдж надо так:
super.addEventListener(Event.ADDED_TO_STAGE, this.handler_addedToStage);

private function handler_addedToStage(event:Event):void {
trace(this.stage);
}

smartan
17.10.2007, 03:08
Текст поста удален, ибо там была полная чушь
-Nirth

DRAGOnoid
18.10.2007, 12:52
извините что то опять туплю.
никак немогу освоить принцип пакетов
есть у меня некий test.fla - там же Тест.as
содержание Тест.as

package {
inport Проект.*;
import flash.display.*;
public class Тест extends Sprite {
public function Тест ():void {
var тест = new ОкноМеню();
}
}
}


внутри ОкноМеню.as

package Проект{
inport Проект.*;
import flash.display.*;
public class ОкноМеню extends Sprite {
public function ОкноМеню ():void {
var тест = new Раздел();
}
}
}


как понятно ОкноМеню.as лежит в папке Проект
теперь же я хочу в папке Проект создать папку Меню или ОкноМеню
чтобы переместить туда большое число as файлов в которых нехочу путаться
что мне надо сделать чтобы заработал файл
Проект\Меню\Раздел.as
или
Проект\Меню\Раздел\Подраздел.as

хотя бы что писать в package и import?
я делал по разному но что то не вышло.

etc
18.10.2007, 13:04
Боже, кто тебя научил классы по-русски называть?
Почему ты никогда не указываешь тип переменной?

DRAGOnoid
18.10.2007, 13:18
давать русские названия классам и переменным меня толкнуло обстоятельство "достало придумывать англайские названия" ))

Пока страшного в этом ничего не вижу так как все классы исключительно либо свои либо для русских проектов...

если зарубежное то конечно максимум коменты =)

про тип переменной ты имеешь ввиду
var переменная:Number = new Number (10)?

кстати а что это даёт? О_о
какое отличие
var переменная:Number = new Number (10);
от
var переменная:Number = 10;
или
var переменная = new Number (10);
или
var переменная = 10;

потому как избыточность кода тоже не есть хорошо.

etc
18.10.2007, 13:20
Это не избытычность кода. Правильная запись:
var variable:uint = 10;

DRAGOnoid
18.10.2007, 13:33
тоже самое наверно касается и переменных класса?
private var variable:uint;

хорошо а в чём эта правильность оправдывает себя? Т.е. чем она лучше ?
а то бывают моменты когда затруднительно определить какая переменная пришла.

etc
18.10.2007, 13:59
Не бывает таких моментов. На скорость это основательно влияет:

var i:uint = 0;
var t:uint = getTimer();
var a = 0;
for (i = 0;i < 10000000;i+=1) {
a+=1;
}
trace(getTimer()-t); // 559
t = getTimer();
var b:uint = 0;
for (i = 0;i < 10000000;i+=1) {
b+=1;
}
trace(getTimer()-t); // 38

DRAGOnoid
18.10.2007, 14:06
почему же
например когда я хочу передать часть XML
например один из его нодов
а внутри нода могут быть а могут и не быть подноды..
var xml:XML = <foo valie="123">
<node value="222">
<node2 value="444" />
<node3>
<[CDATA[какой нить HTML]]>
</node3>
</node>
</foo>;


в итоге не совсем понятно когда
xml.node - вернёт XMLList;
а когда xml.node.node3 - XML

чтобы обойти такой случай обычно извращаюсь
var new_xml:XMLList = xml.node.node3.toXMLString();

писал по памяти но примерно так это выглядело.

etc
18.10.2007, 14:11
Там может быть либо XMLList, либо XML. Других вариантов нет. toXMLString возвращает String, в данном случае надо было юзать toString().
См. тест на предыдущей странице и оцени разницу с типизацией или без.

DRAGOnoid
18.10.2007, 14:23
да работает чуть быстрее =) всётаки на фоне 10.000.000 операций 560 и 40 не велика разница ;) ладно всёравно луче использовать хотя бы для того чтобы понимать какого типа данная переменная...
про XMLList и XML это пример просто - помню просто были ещё подобные случаи когда например в класс передаю строку а иногда не хочу ничего передавать и пишу null и тогда кричит (ну или что то подобное - я реально щас уже не вспемню)

ладно вернёмся к пакетам - я тут пошаманил и получилось чтобы заработал пкет типа Проект.Окно.Раздел
надо внутри
Проект\Окно.as
написать
import Проект.Окно.*;
жаль что обычный
import Проект.*;
неработает.

а внутри
Проект\Окно\Раздел.as
написать
package Проект.Окно {
...
}

всё правильно? по другому никак?

DRAGOnoid
18.10.2007, 15:09
а вот такой шутки я вообще не понял.
щас сижу пишу, правлю XML и чпок ошибка!
TypeError: Error #1088: The markup in the document following the root element must be well-formed

ну думаю как обычно бывает - где то что то нето напичатал, смотрю ищю - ничего не нашёл. Стал разбирать по нодам.. работает, добавля, работает, ещё добавляю... и так до последнего...
ахха значит ошибка в ноде думаю - ошибку не нашёл!
а потом до меня дошло - а может это типа XML слишком большой - всётаки 5кб!

ну на всякий случай решил проверить что у меня вообще загружается - без парсинга выдаю только data - и вот что вижу:

<body>
..........
<category/>
<category/>
<category/>
</body>tStream

иногда показывает NetStream. ОТКУДА???

вот как я грузил XML
package {
import flash.events.*;
import flash.system.*;
import flash.net.*;
import flash.xml.*;

public class XmlLoader {
private var loader:URLLoader;
public function XmlLoader ():void {
System.useCodePage= true;
}
public function loadXmlTo (url:String):void {
this.loader = new URLLoader();
configureListeners (this.loader);
var request:URLRequest= new URLRequest(url);
this.loader.load (request);
}
// конфигурация
private function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(Event.COMPLETE, completed);
}
// загрузилось
private function completed (event:Event):void {
//this.xml = new XML(event.target.data);
trace (this.loader.data);
}
}
}

etc
18.10.2007, 15:11
System.useCodePage= true;
За это убивать надо.

DRAGOnoid
18.10.2007, 15:14
почемуу? Т__Т
а как же мне тогда избавляться от глюков с кодировкой?

etc
18.10.2007, 15:15
Использовать utf-8 в качестве кодировки. Всегда и везде, при любых обстоятельствах.
А не думать о левых win-кодировках.

DRAGOnoid
18.10.2007, 15:21
блин я уже не смогу перевести огроменный XML который сам же руками порой и правлю и систему которая этот XML генерит весь в UTF-8

а других способов нет? =(

etc
18.10.2007, 15:26
Почему не сможешь?

DRAGOnoid
18.10.2007, 15:53
ну щас для теста я пишу на Notepad++ а там невижу как перевести в UTF-8.
сам PHP который генерит XML - выдаёт данные в виде echo (вопрос уже не ко мне)
короче сложно будет очень (

DRAGOnoid
18.10.2007, 16:10
ладно буду привыкать к UTF-8 - спасибо! ;)

BlooDHounD
18.10.2007, 16:42
мдя... открыть файл влюбом дргуом редакторе, который умеет это делать, и сохрать его в utf-8 религия не позволяет? подойдт даже обычный нотпад.

DRAGOnoid
18.10.2007, 16:45
да спасибо - я уже решил этот вопрос - просто придётся попотеть чтобы всё переписать под UTF-8.
в том же Notepade++ это всё грамотно решается.. Я просто реально боялся проблем с UTF-8, потому как привык кодить под HTML и просматривать ресурсы в нотпаде )

DRAGOnoid
18.10.2007, 18:14
у меня есть спрайт, внутри которого текстовое поле.
текстовое поле получает какой то HTML код в котором могут быть картинки, конечно картинки сразу не загружаются и поле имеет одну высоту, потом картинки загружаются и высота изменяется.

можно ли как то отловить это событие?
а то
this.текст.addEventListener (Event.RESIZE, действие);
не хочет срабатывать =(

это для скрола надо.

BlooDHounD
18.10.2007, 20:07
я прошу сообщество флэшеров перестать помогать персонажу DRAGOnoid до тех пока он не перестанет травмировать наш мозг русскими буквами в коде.

etc
18.10.2007, 20:10
я прошу сообщество флэшеров перестать помогать персонажу DRAGOnoid до тех пока он не перестанет травмировать наш мозг русскими буквами в коде.
Плюс один.

DRAGOnoid
18.10.2007, 20:17
ладно ладно - не буду больше )

так всётаки есть ли решение проблемы?
this.my_text.addEventListener (Event.RESIZE, action);

etc
18.10.2007, 22:46
Ну а почитать про события текстфилдов лень что-ли? Есть же хелп!

Xelat
21.10.2007, 20:54
У меня есть вопросик один (юзал поиск, но ничего нужного не нашёл).
Проблема в следующем, у меня есть мувиклип, в котором находится прямоугольник (shape) залитый определённым битмапом, и мне надо периодически менять размеры мувиклипа, но чтобы при этом заливка битмапом не растягивалась, а тайлилась.
Вижу только два выхода из ситуации -- найти способ менять размеры мувиклипа без растягивания (scale'а), либо при изменении размеров мувиклипа удалять старый прямоугольник, и рисовать новый по размерам мувиклипа (и то не уверен что так получится).
Подскажите что и как мне сделать, чтобы решить проблему?
Спасибо.

etc
21.10.2007, 21:23
beginBitmapFill

Xelat
22.10.2007, 22:36
beginBitmapFill
А как тогда выдрать этот самый битмап из либы во время выполнения чтобы сделать им заливку?

BlooDHounD
22.10.2007, 23:25
getDefinition ?

2morrowMan
23.10.2007, 01:03
А как тогда выдрать этот самый битмап из либы во время выполнения чтобы сделать им заливку?
Кликаешь на битмапе в библиотеке, выбираешь Linkage, вводишь в поле Class имя(для примера MyBitmap), с помощью которого потом будешь создавать это Битмап.
Дальше в коде:

var bmpData:BitmapData = new MyBitmap(0, 0);
// bmpData - это та BitmapData, нужна для beginBitmapFill()

Xelat
23.10.2007, 23:48
2morrowMan
Огромное спасибо!

DRAGOnoid
04.11.2007, 17:21
Здравствуйте ещё раз.
я уже как то задавал вопрос но чёткого небыло :confused:

в общем делаю что то типа мультизагрузчика.

public function ElementsLoader():void {
this.loader = new Loader();
this.loader.contentLoaderInfo.addEventListener(Event.COMPLETE, complete);
this.loader.load(new URLRequest('swfs/image.jpg'));
}
private function complete (event:Event):void {
var info:LoaderInfo = event.target as LoaderInfo;
trace (info.contentType);
trace (info.content);
}


теперь если например я загружаю SWF внутри которого в библиотеке есть что то - то я просто определяю

var my_class = info.applicationDomain.getDefinition('something');
var test = new my_class();
addChild(test);


если мне надо просто добавить на экран загруженный элемент я пишу так

var test = info.content;
addChild (test);
// конечно если я сделаю так
var test2 = info.content;
test2.x=200;
addChild (test2);
// то он добавится вместо test


задача стоит в размножении таких jpg или swf файлов. Как я уже говорил идеально было бы добиться получения их в виде Класса.

можете посоветовать как лучше добиться этого без повторных загрузок?

vapes
05.11.2007, 11:36
Я где-то уже говорил об этом с __etc, в такой же тупик заходил.
А попробуй так
var test:MovieClip = new info.content.someMovieClip();

DRAGOnoid
05.11.2007, 14:03
что то не понял что ты имеешь ввиду под info.content.someMovieClip();
дело в том что info.content - уже сам по себе DisplayObject. Вот я кстати подумал - попробую поискать на флешере инфу по дублированию DisplayObject'а.

vapes
05.11.2007, 14:14
someMovieClip - это клип, который лежит в шаред лайбрари подгруженного мувика. Вот его конструктор и вызывай.

DRAGOnoid
05.11.2007, 14:45
да с шаред либой нет проблем вообще - я ж написал чуть выше..
проблема когда надо подгрузить JPG в виде класса.

кстати порыскал во флешере и наткнулся вот на что

var target = info.content;
var targetClass:Class = target['constructor'];
trace (targetClass);
var bg2 = new targetClass();
trace (bg2);
addChild(bg2);


смешное то что без ошибок выдаёт
[class Bitmap]
[object Bitmap]
но на экране пусто =(

etc
05.11.2007, 15:07
Я думаю, лучше это:

var bmp:BitmapData = (info.content as Bitmap).bitmapData.clone();
var bitmap:Bitmap = new Bitmap(bmp);
addChild(bitmap);

Не проверял.
А ты создаешь пустой битмап, поэтому на экране ничего нет.

DRAGOnoid
05.11.2007, 16:08
проверил, работает!!! Спасибо __etc огромное! наконец решился один уже смерть как замучавший трабл !

а для MovieClip подобную махинацию провести можно а то та же фигня (

etc
05.11.2007, 17:10
Для мувиклипа нужно использовать либо getDefinition, либо через через конструктор.
Что-то вроде:

var clip:MovieClip = (info.content as DisplayObjectContainer).getChildByName('myClip') as MovieClip;
var ClipClass:Class = (clip as Object).constructor;
var myClip:MovieClip = new ClipClass() as MovieClip;
addChild(myClip);

Естесственно, на сцене загруженного ролика должен находится клип с именем myClip.

DRAGOnoid
05.11.2007, 18:23
смысл понял что ты хочешь.
но это считай то же самое что и шаред обжект. Я просто хотел добиться чтобы можно было загружать анимацию или другие вещи в SWF без наворотов. т.е. обычная анимация на первой сцене подгружаемого SWF.

неужели нет способа просто склонировать этот info.content? Или адобовцы специально затачивались чтобы все подобные вещи были только через Shared Object?

etc
05.11.2007, 19:57
Ну попробуй тот же финт, только с content. Я не пробовал, может и заработает.

И причем тут SharedObject, я не понял.

milDude
24.11.2007, 15:21
Вся флешка состоит из одного as-скрипта. Во fla-файле нет ничего кроме прописанного Document class.

Как сделать прелоадер для такого флеш?

etc
24.11.2007, 15:29
А зачем?

milDude
24.11.2007, 15:35
В первую секунду после запуска флешка притормаживает.
Мне подумалось что это из-за того, что флешка не успела дозагрузиться.

etc
24.11.2007, 15:39
Сколько весит флешка?
И почему такой вывод?

milDude
24.11.2007, 15:49
флешка весит 1.85 Кб
зависает только если запускать Ctrl+Enter'ом
вывод сделан от балды
-----------------------
На будущее хочется знать как сделать прелоадер. Вдруг кода будет много.

etc
24.11.2007, 15:52
Значит выполняется сложный код, раз подтормаживает.

http://etcs.ru/blog/cs3/export_in_second_frame_flash_cs3/

milDude
25.11.2007, 12:29
так работает:

package code {
import flash.display.*;
import flash.events.*;

public class Answers extends Sprite{

private var nameplate;

public function Answers(){
nameplate = new Nameplate();
addChild(nameplate);
nameplate.x = 5;
addEventListener(Event.ENTER_FRAME, nameplatemoved);
}
public function nameplatemoved(e:Event):void{
nameplate.y = mouseY;
}
}
}

import flash.display.*;
import flash.events.*;
import flash.geom.Matrix;

class Nameplate extends Sprite {

public function Nameplate(){
graphics.lineStyle(8,0x777777,1.0,false,"normal",CapsStyle.SQUARE,null,0);
graphics.lineTo(0, 40);
}


}

так не работает (указатель мыши трясётся и не в тех координатах):

package code {
import flash.display.*;
import flash.events.*;

public class Answers extends Sprite{

private var nameplate;

public function Answers(){
nameplate = new Nameplate();
addChild(nameplate);
nameplate.x = 5;
addEventListener(Event.ENTER_FRAME, nameplate.moved);
}

}
}

import flash.display.*;
import flash.events.*;
import flash.geom.Matrix;

class Nameplate extends Sprite {

public function Nameplate(){
graphics.lineStyle(8,0x777777,1.0,false,"normal",CapsStyle.SQUARE,null,0);
graphics.lineTo(0, 40);
}

public function moved (e:Event):void {
this.y = mouseY;
}
}

etc
25.11.2007, 12:35
Во втором коде где вы берете mouseY?

Andrianov
09.12.2007, 17:54
Передо мной встала такая проблема: сделать так чтобы одно событие вызывалось только в том случае если уже вызвано 2-ое. в AS2 это могло бы выглядеть как-то так:
bla.onEnterFrame = function():Void {
bla_button.onMouseMove = function():Void {...}
}
Подскажите пожалуйста как сделать нечто подобное средствами AS3 :rolleyes:
З.Ы. проблему уже решил следующим образом:
bla.addEventListener(Event.ENTER_FRAME, bla_func);
private function bla_func(event:Event):void {
bla1.addEventListener(MouseEvent.MOUSE_MOVE, bla1_func);
}
private function bla1_func(event:Event):void { .. }

3ds
09.12.2007, 18:52
Извините если поднял ненужный вопрос - просто хотел бы создать топик в котором можно было бы сконцентрировать вопросы ну уж совсееем для тех кто не в теме.

При необходимости можете удалить тему...

Ну так вот - тема AS3 относительно молодая. Это видно хотя бы потому что документаций и примеров по ней не так и много, можно сказать практически нет.

но а что есть - не совсем понятно что для чего и откуда берётся.

Если позволите я буду задавать совсем глупые вопросы - которые возможно бы пролили свет на то что происходит...

итакс начну.
Поставил 9ю версию флеша, настроил Паблик на AS3 и открываю окно программирования.

первое что хочу сделать - написать 'Приветище мир!'
пишу
trace ("Приветище мир!");
жму Ctrl+Enter
работает!

натыкаюсь на пример в инете:

package main {
import flash.display.Sprite;

public class test1 extends Sprite {
public function test1() {
trace("Hello World");
}
}
}


пример взят отсюда http://www.timezero.ru/storm/

вот тут меня и понесло задавать вопросы...
например что ещё за package?
для чего нужна строчка ?
import flash.display.Sprite;
и что она означает ?

как разобраться с классами если раньше с ними никогда не работал
public class test1 extends Sprite { }
тем более что слов много и непонятно что для чего
и функция тоже
public function test1() { }
вроде как всё знакомо но непонятно какои образом она вызвалась, или как вызвался класс....
В общем совсем ничего не понятно....

я так же пытался почитать http://livedocs.adobe.com/flex/201/langref/index.html
но там тоже только описание операторов, но простейших примеров как они работают нет. Догадайся мол сам =(
стучи в аську, дам книгу, тока на английском... там вроде понятно написано

Andrianov
09.12.2007, 22:26
to 3ds Он вроди уже разобрался ;) У меня возник такой вопрос: звук в AS3 воспроизводится также как и в AS2 .play() а вот на .stop() ругается... и что делать?

DarkLight
09.12.2007, 22:29
stop() - это метод SoundChanell-а связаннного с данным объектом Sound-а, у него его и надо вызывать

Andrianov
09.12.2007, 22:31
2DarkLight спасибо большое уже сам разобрался :) обидно, что встроенный в ide хелп такой запутанный, часто спрашиваешь то, что есть, а не смог найти :(

Andrianov
09.12.2007, 23:37
Возник еще один вопрос, а именно: вот в AS2 было у объекта Sound свойство duration... В AS3 я его не нашел :( Подскажите пожалуйста как его найти.

DarkLight
09.12.2007, 23:42
а теперь оно называется length:)

Andrianov
09.12.2007, 23:56
Спасибо тебе, добрый человек, помог! :) видел, но почему-то не соотнес, видимо голова уже устала :)

etc
10.12.2007, 01:10
На будущее: читайте раздел AS 2.0 Migration в хелпе.

Andrianov
10.12.2007, 02:27
Спасибо, учту.

milDude
14.12.2007, 15:33
Optics.as - Document Class
package code {

public class Optics extends Sprite{

private var lookedObject;

public function Optics(){

lookedObject = new LookedObject(); addChild(lookedObject);

}

}
}

LookedObject.as
package code {

class LookedObject extends Sprite {

public var point1;

public function LookedObject(){
point1 = new Point(); addChild(point1);
}
public function drawLine():void{
trace('code');
}

}
}

Point.as
package code {

class Point extends Sprite {

public function Point(){
graphics.beginFill(0xcccccc, 1);
graphics.drawCircle(0, 0, 5);
}
override public function set y(value:Number):void {
super.y = value;
parent.drawLine();
}
}
}

CompillerErrors

1061: Call to a possibly undefined method drawLine through a reference with static type flash.display:DisplayObjectContainer.


Подскажите пожалуйста где ошибка?

etc
14.12.2007, 16:36
(parent as LookedObject).drawLine();

milDude
15.12.2007, 09:54
я не могу понять как в моём случае выглядит "display list"?

etc
15.12.2007, 11:58
Optics > LookedObject > Point

milDude
20.12.2007, 18:10
1) "display list" разве это иерархия классов? Я думал это иерархия экземпляров класса. Или бывает и так и сяк?

2) как тогда должен выглядеть код? (я хотел чтобы на экране было две точки. При изменении Y любой из точек, между ними бы перерисовывалась линия)

etc
20.12.2007, 18:19
1) Это список визуальных объектов, а не иерархия классов;

2) Какой код? Прочтите хелп, наконец.

milDude
20.12.2007, 19:11
1) если это не иерархия классов, то правильно:
Optics > lookedObject > point1

а не:
Optics > LookedObject > Point

2) (parent as LookedObject).drawLine();
мой код вызывает статический метод drawLine?

etc
20.12.2007, 19:17
1) Я перечислил имена классов, а не имена display object-ов. Имена у вас не определены вообще, поэтому ваша иерархия неверна.
2) Нет, не статический, а вполне себе метод экземпляра, с предвариательным кастингом.

milDude
20.12.2007, 19:32
re 1) Что значит имена не определены?
А что это такое?:

lookedObject = new LookedObject(); addChild(lookedObject);
и
point1 = new Point(); addChild(point1);

re 2) Что вы хотели сказать этим?:
(parent as LookedObject).drawLine();

etc
20.12.2007, 19:37
1) Это имя переменной, а не имя display-объекта, см. свойство name у DisplayObject;

2) Я этим хотел сказать кастинг родительского объекта (в схеме display list это как раз экземпляр LookedObject) в LookedObject и вызовом соответствующего метода этого самого объекта.

FilimoniC
25.12.2007, 15:03
У меня маленький вопрос - как правильно удалить обхект:
Присвоить ему значение null или undefined, чтобы GC его стер? В c++ учили NULL, в AS3-E видеоуроках учат undefined, но в доках к флешу где-то откопал что надо null
configArray[parameterName] = undefined;
или
configArray[parameterName] = null;


Сделал небольшой тест:

var a:Array;
a = new Array();
a["v1"]="valueOk1";
a["v2"]="valueOk2";
a["v3"]="valueOk3";
a["v4"]="valueOk4";
a["v5"]="valueOk5";
a["v6"]="valueOk6";

a["v3"] = undefined;
delete a["v3"];


for (var i in a)
trace (i + " => " + a[i]);


Листинг массива показал, что объекта в массиве нет.
Только вот вопрос, останется ли в памяти "v3" => "valueOk3" после такого в памяти болтаться?

etc
25.12.2007, 16:22
Надо null.
А удалит GC или нет — ему решать.

FilimoniC
25.12.2007, 16:50
Спасибо.
Еще вопрос: насколько хорошо работает функция System.gc() в отладочном плеере? Можно ли его (пллер) поставлять вместе с продуктом - по памяти довольно критично, а тут получается что можно gc управлять ^_^ ;)

etc
25.12.2007, 16:51
Средств управления GC в AS нет.

FilimoniC
25.12.2007, 16:55
Средств управления GC в AS нет.
А вот это?

Package flash.system
Class public final class System
Inheritance System Object

....

gc () method
public static function gc():void
Language Version : ActionScript 3.0

Forces the garbage collection process.

For Flash Player debugger version only.
Player Version: Flash Player 9 Update 3.

etc
25.12.2007, 17:10
Ну а толку от того, что он есть в дебаговом плеере? В обычном же не будет работать.
Бесполезный артефакт, в общем.

ffx
01.01.2008, 00:37
вот читал, что в AS3 не стоит пистаь код в timeline
то есть как я понял чтобы выполнить определенный код в определенном фрэйме, то нужно в классе enterFrame event обрабатывать? и только так правильно?

etc
01.01.2008, 15:01
Есть метод addFrameScript, если хочется определенные действия в определенном кадре.

ffx
05.01.2008, 20:20
__etc, спасибо

var e:String = "<p>A string with <b>HTML</b> in it</p>";
var e2:RegExp = /\b<..?>\b/g; // и так тоже /\b<.*?>\b/g
var result:Array;
while ((result = e2.exec(e))!= null )
{
trace( result );
}
хочу вывести все теги строки e, но в итоге ничего не выводит
не пишите мне пожалуйста как оно будет работать, мне нужно понять почему мой вариант не работает

etc
05.01.2008, 21:04
Неправильный шаблон регулярного выражения.
И почему нельзя было использовать match?

Nicolas Prof
10.01.2008, 17:29
Вопрос почему получаю ошибку?
Есть такой код:


...

private var thBar:MovieClip = new MovieClip();

...

private function buildThumbs():void {
var maska:Sprite = new Sprite();

...

for (var i=0; i<_data.foto.length(); i++) {
var imgHolder:MovieClip = new MovieClip();
var pic:MovieClip = new MovieClip();
var border:ImageBG = new ImageBG();
var strip:LoadBar = new LoadBar();
...

...
imgHolder.addChild(border);
imgHolder.addChild(strip);
imgHolder.addChild(pic);
thBar.addChild(imgHolder);
}
addChild(thBar);
addChild(maska);
thBar.mask = maska;
loadQUE();
trace(thBar.getChildAt(0).getChildAt(0));
}


trace(thBar.getChildAt(0).getChildAt(0));
возвращает
1061: Call to a possibly undefined method getChildAt through a reference with static type flash.display:DisplayObject.

Кто то может объяснить как по Мувиклипам "ходить" на сцене?
В АС2. было бы примерно this.thBar.imgHolder.pic

Потому что пример выше из хелпа, и получаю ошибку...

etc
10.01.2008, 17:43
Метод getChildAt есть у DisplayObjectContainer, а возвращает он DisplayObject. Ошибка как всегда та же — нет кастинга к нужному типу.

Nicolas Prof
10.01.2008, 17:57
не понял, возвращаемся к хелпу.
делаю следующее


traceDisplayList(thBar);

private function traceDisplayList(container:DisplayObjectContainer,indentString:String = ""):void {
var child:DisplayObject;
for (var i:uint=0; i < container.numChildren; i++) {
child = container.getChildAt(i);
trace(indentString, child, child.name);
if (container.getChildAt(i) is DisplayObjectContainer) {
traceDisplayList(DisplayObjectContainer(child), indentString + " ");
}
}
}


и все работает. Так что я тогда делаю не так? И как надо?

2morrowMan
10.01.2008, 17:58
trace((thBar.getChildAt(0) as MovieClip).getChildAt(0));

Nicolas Prof
10.01.2008, 18:06
спасибо.
Еще вопрос как достучаться как в моем примере к тому же thBar на сцене уже?

точнее добавлю, я знаю как достучаться, в моем случае
getChildAt(2)
но как если более 2 вложенных мувиклипов? как добраться до третьего?

Agilmeister
31.01.2008, 18:20
Приветствую,

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

BlooDHounD
31.01.2008, 18:47
в хелпе написаны примеры URLLoader и т.д.

Olegg
07.02.2008, 15:22
Agilmeister , можешь проще - создать на сцене динамическое текстовое поле,instance - text,var - например newtext.В текстовом редакторе пишешь newtext=тарарараарарар.Во флэше на кадре пишешь LoadVariablesNum("имя_файла".txt,уровень);
старый дедовский способ.ггг
Блокнот сохраняй в Юникоде.

etc
07.02.2008, 18:08
Olegg, вы смотрели на название темы и на раздел, в котором она располагается? Похоже, что нет.

Olegg
07.02.2008, 18:23
простите,запарилсо...Щас допишу.
можно так:

Грузим XML во флеш:

var appXml:XMLLoader;
appXml = new XMLLoader();
appXml.addEventListener(XMLLoader.COMPLETE, getDataFromXML);
appXml.load(in_xmlUrl);

и обрабатываем

private static function getDataFromXML(e:Event):void{
trace("appXml Loaded");
appXml.traceXML();
var tXML:XML = appXml.getXML();
//Тут уже работаем с tXML .....
}

))) Если я на это раз правильно понял...

etc
07.02.2008, 18:44
Olegg, вы на какой вопрос отвечали?
Что такое XMLLoader?

BlooDHounD
07.02.2008, 18:44
а что такое XMLLoader ?

Olegg
07.02.2008, 19:17
В данном случае написано,как извлечь переменные из XML.Может не в тему,но полезно :)))
Хотя я опять запарился,надо было через URLLoader()...Ладно,проехали..

А что такое XMLLoader? :)

BlooDHounD
07.02.2008, 20:17
ну это вы его использовали а не я.

etc
07.02.2008, 22:55
И, тем более, не я. Лично мне неизвестен класс XMLLoader.

flastar
09.02.2008, 20:23
Записал видео туториал работы с библиотекой Tweener(11mb)
http://www.rapidshare.ru/572390

KripTon
11.02.2008, 21:13
Есть ли у кого учебник по AS3? или линк? К сожалению не смог найти. Нашёл по AS2, но слышал, что лучше учить сразу AS3. В программировании впринципе соображаю (PHP, TPascal, JS)

Reflection
15.02.2008, 10:47
Народ, помогите. Я понимаю что это для вас легко, но прошу не смеяться надо мной и моим вопросом 1 раз пытаюсь изучить программирование :)

Нужно с помощью цикла создать 5 мувиклипов с названиями, например, thisMC1,thisMC2....thisMC5 (потом количество MC будет зависить от длинны массива), вся проблема моя в том, что я не знаю как и куда приписать в код "i" чтобы к имени прибавлялась цифра

for (var i:int=0;i<5;i++) {

thisMC = new MovieClip();
thisMC.x = 10*i+10;
thisMC.y = 10;
thisMC.scaleX= .5;
thisMC.scaleY= .5;
addChild(thisMC);

}

как писать код thisMC+"i" или "thisMC"+i или как?
ни так ни так не получается. :rolleyes:

etc
15.02.2008, 10:51
Уточняю: имя переменной или имя клипа?

BlooDHounD
15.02.2008, 10:51
thisMC.name = "thisMC"+i;

Reflection
15.02.2008, 11:22
может я что-то не понял :umnik2:

BlooDHounD, вы имели ввиду так ?

var thisMC:MovieClip;
var MCname;
for (var i:int=0;i<5;i++) {


MCname = "thisMC"+i;
MCname = new MovieClip();
MCname.x = 10*i+10;
MCname.y = 10;

MCname.scaleX= .5;
MCname.scaleY= .5;
MCname.graphics.lineStyle();
MCname.graphics.beginFill(0x000000);
MCname.graphics.drawCircle(50,50,50);
MCname.graphics.endFill();
addChild(MCname);

}

В принципе работает, но я думал можно без переменной MCname сделать :umnik2:

BlooDHounD
15.02.2008, 12:34
господи. как это может работать? я имел ввиду так как написал.
Вы можите свой кусок приведенный выше скрестить с моим?

Reflection
15.02.2008, 12:38
BlooDHounD, вы можете написать конкретно, куда и как? синтаксис thisMC.name = "thisMC"+i; мне не очень понятен. куда его пихать, вместо MCname? - не работает.

Напишите пожалуйста 1 раз чтоб вопросов больше не было, и я буду разбираться.Мне нужен пример.надеюсь не сочтете за трудность =)

господи. как это может работать?
странно, но у меня работает=) (хотя это я так понял не правильно)

etc
15.02.2008, 12:50
А вы можете посмотреть в документации, что такое name у наследников DisplayObject?

BlooDHounD
15.02.2008, 13:02
for (var i:int=0;i<5;i++) {
thisMC = new MovieClip();
thisMC.x = 10*i+10;
thisMC.y = 10;
thisMC.scaleX= .5;
thisMC.scaleY= .5;
addChild(thisMC);
}+thisMC.name = "thisMC"+i;=for (var i:int=0;i<5;i++) {
thisMC = new MovieClip();
thisMC.x = 10*i+10;
thisMC.y = 10;
thisMC.scaleX= .5;
thisMC.scaleY= .5;
thisMC.name = "thisMC"+i;
addChild(thisMC);
}

Reflection
15.02.2008, 13:10
BlooDHounD, спасибо. =) Оказалось все просто

Arreke
27.02.2008, 23:57
Возможно ли в ActionScript определить координаты мышки, если она находится не в области флешки, а за её пределами?
Если за пределами флешки не получится, то возможно ли это при помощи ActionScript + JavaScript на Web-страничке?

etc
28.02.2008, 00:16
Нельзя.

Arreke
28.02.2008, 00:19
Если за пределами флешки не получится, то возможно ли это при помощи ActionScript + JavaScript на Web-страничке?

etc
28.02.2008, 00:22
Возможно, в пределах страницы, конечно же.

CEBEP
28.02.2008, 01:36
Скажите а для чего обычно используют Document Class ?

Можно какой-нибудь практический пример?

и какая разница, когда в фукции listener-А пишут (event : Event) и (e : Event) ?

etc
28.02.2008, 02:24
Скажите а для чего обычно используют Document Class ?
А вы что, код в кадрах пишете? Вообще-то AS3 — язык с примением классов и Document class является входной точкой приложения.

и какая разница, когда в фукции listener-А пишут (event : Event) и (e : Event) ?
Никакой разницы, это название аргумента метода и все.

vadja
28.02.2008, 21:01
??? как передать переменную в функцию, вызванную addEventListener(), в хелпе ни слова про переменные.

разобрался.
ссылка на ответ, покачто так:
http://www.flasher.ru/forum/showpost.php?p=715123&postcount=4

CEBEP
28.02.2008, 22:21
А почему можно указывать функцию а потом её определять?
Ведь нельзя же работать с переменной а потом её определять, почему же с фукцией можно?

etc
28.02.2008, 23:18
??? как передать переменную в функцию, вызванную addEventListener(), в хелпе ни слова про переменные.

разобрался.
ссылка на ответ, покачто так:
http://www.flasher.ru/forum/showpost.php?p=715123&postcount=4
Прочитайте тему, на которую вы дали ссылку внимательно и так не делайте.
Я уже жалею, что дал подобный код в качестве примера.

CEBEP, код покажите. Если ваш код до сих пор хранится во fla-файле, то я вам не отвечу тогда.

vadja
29.02.2008, 00:40
и так не делайте

ммм, а как тогда правильнее?

CEBEP
29.02.2008, 00:46
package
{
import flash.display.MovieClip;
import Card;

public class MemoryGame extends MovieClip
{
private var _card:Card;

public function MemoryGame()
{
createCards();
}

private function createCards():void
{
_card = new Card();
addChild(_card);
}
}
}

Вот выдрал из видео примеров Тода Перкинса.

Разве " function createCards()" не должна быть до того как ней обратятся в "function MemoryGame()"

З.Ы.: узрел истину почему не надо писать в кадрах, больше не пишу :)

BlooDHounD
29.02.2008, 01:05
как Вы думаете, если бы компилятору было важно где описан метод, то смог бы он скомпилировать код:private function methodA(param:uint):void {
if (param>0) this.methodB( param-1 );
}
private function methodB(param:uint):void {
if (param>0) this.methodA( param-1 );
}

etc
29.02.2008, 01:28
ммм, а как тогда правильнее?
Я же говорю — прочитайте тему.

vadja
29.02.2008, 01:56
2 __etc

как было:
тему прочитал, нашел в ней ответ на свой вопрос (сделал согласно тому, что там написано, все работает), теперь оказывается, что решение не совсем гуманное, хочу выяснить почему, а точнее хочу понять что мне делать, оставлять то, что есть, или искать другое решение.

в названии "Как передать параметр в общую функцию события" я ответа не вижу. Пояснишь?

etc
29.02.2008, 10:07
тему прочитал, нашел в ней ответ на свой вопрос (сделал согласно тому, что там написано, все работает), теперь оказывается, что решение не совсем гуманное, хочу выяснить почему, а точнее хочу понять что мне делать, оставлять то, что есть, или искать другое решение.
Нифига вы не прочитали, там три страницы в теме с ответом на вопрос и примеры есть.
Нужно писать кастомное событие, с публичными переменными, в которых и передаются параметры.

DRAGOnoid
29.02.2008, 15:45
можно ли как-нибудь импортировать пакет классов расположенных папкой выше?
т.е. есть 2 папки folder1 и folder2. В папке folder1 расположен FLA + AS проекта, а в folder2 набор классов. и хотелось бы как то методом
import folder2.*; сделать.

зачем это надо? Просто у меня скопилось масса проектов использующие один и тот же набор классов, причём классы я постоянно улучшаю. Делать лишние копии одной и той же папки тоже не хочется.
P.S.
Не путатайте пожалуйста набор общих классов с набором классов отдельного проекта.

BlooDHounD
29.02.2008, 18:09
в свойствах проекта для таких целей есть classpath. их может быть несколько

Arreke
29.02.2008, 22:22
for (i=0; i<11; i++) {
_root.createTextField("myTxt_"+i,10+i,150,150,100,100);
massiv[i] = "myTxt_"+i; //Вот здесь как правильно нужно написать?
}


Вот здесь я делаю неправильно, т.е. в массив нужно засунуть каждый созданный DynamicText.
Подскажите, пожалуйста, как привильно нужно это сделать.

tz_azz
01.03.2008, 02:48
Посоветуйте плиз, какую-нибуть хорошую книгу для чайников по АS3.

Arreke
01.03.2008, 08:20
Посоветуйте плиз, какую-нибуть хорошую книгу для чайников по АS3.

Вот эта книга когда то мне очень помогла - http://www.ozon.ru/context/detail/id/1401736/, написано легко и доступно.
Можно сказать с неё у меня всё и началось.

И ещё, кажется ты перепутал тему.

etc
01.03.2008, 10:48
Arreke, это раздел по AS3, а не AS1. И книга, которую вы посоветовали, тоже по AS1. Если вы не знаете разницы, то самое время узнать и задавать вопрос в соответствующем разделе.
Перепутали тему как раз вы.

DRAGOnoid
05.03.2008, 18:03
в свойствах проекта для таких целей есть classpath. их может быть несколько

что то мне не удалось решить проблему..
в Publish Settings \ Flash \ ActionScript Settings \в classpath добавляю
../folder2

выдаёт ошибку
5001: The name of package 'folder2' does not reflect the location of this file. Please change the package definition's name inside this file, or move the file.

поправка проблему тут же решил поставев вместо
../folder2
../

спасибо за совет!