Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   не могу запустить скрипт кнопки! (http://www.flasher.ru/forum/showthread.php?t=131547)

amigomos 22.10.2009 23:13

не могу запустить скрипт кнопки!
 
Здравствуйте. Я начал изучать flash и вот пробую испытать кнопку SimpleButton. Я ее нарисовал в свойствах ее указал как "кнопка",назвал ее knop и поставил галочку на "экспорт в Action Script" . Написал код

Код AS3:

package {
    import flash.events.MouseEvent;
        import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.SimpleButton;
 
        public class proba extends MovieClip {
        public function proba() {
                        var knop:SimpleButton = new SimpleButton();
                        addEventListener(MouseEvent.MOUSE_DOWN, dis);       
                                }
        }
    public function dis(e:MouseEvent):void {
                trace("Привет!");
        }
}

но почему то на первой строчке кода( " package { ") все время выскакивает ошибка
1046: Type was not found or was not a compile-time constant: knop.

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

Felicast 23.10.2009 11:58

Код AS3:

package 
{
        import flash.events.MouseEvent;
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.display.SimpleButton;
 
        public class Proba extends MovieClip
        {
                public var knop:SimpleButton;
                public function Proba()
                {
                        knop.addEventListener(MouseEvent.MOUSE_DOWN, clickHandler);
                }
                public function clickHandler(e:MouseEvent):void
                {
                        trace("Привет!");
                }
        }
}

обратите внимание на все отличия моего кода от вашего и примите к сведению (и не забудьте переименовать название файла с большой буквы (Proba))

amigomos 23.10.2009 15:09

Большое спасибо за подсказку. Учту ваши рекомендации. Вставил,ваш, исправленный код и теперь выскакивает ошибка
1151: A conflict exists with definition knop in namespace internal.
(10 строчка где обьявляеться кнопка "public var knop:SimpleButton;" )

СлаваRa 23.10.2009 15:32

Код AS3:

public var knop:SimpleButton;

надо заменить на
Код AS3:

public var knop:SimpleButton = new SimpleButton();


Gaen 23.10.2009 16:03

Надо убрать в настройках AS3 галку "Automatically declare stage instances"

Felicast 23.10.2009 17:41

2СлаваRa - не правильно.
правильный путь подсказал GAIKER.
еще возможно просто удалить эту строчку. но лучше сделать как сказал GAIKER

Alex Lexcuk 23.10.2009 20:41

Цитата:

Сообщение от amigomos (Сообщение 860048)
Большое спасибо за подсказку. Учту ваши рекомендации. Вставил,ваш, исправленный код и теперь выскакивает ошибка
1151: A conflict exists with definition knop in namespace internal.
(10 строчка где обьявляеться кнопка "public var knop:SimpleButton;" )

Вы указали нарисованной кнопке инстанс имя knop и вы же ее создаете public var knop, естественно будет конфликт, ее создавать не надо, ее надо уже использовать.
Код AS3:

package 
{
        import flash.events.MouseEvent;
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.display.SimpleButton;
 
        public class Proba extends MovieClip
        {
                //public var knop:SimpleButton;//не надо
                public function Proba()
                {
                        knop.addEventListener(MouseEvent.MOUSE_DOWN, clickHandler);
                }
                public function clickHandler(e:MouseEvent):void
                {
                        trace("Привет!");
                }
        }
}

по поводу отключения автоматического декларирования, я так не делаю, ибо считаю, что в этом нет никакого смысла.
Есть примеры с кнопками
http://www.murmadillo.tut.su/html/XML_MENU.rar
http://www.murmadillo.tut.su/m/rev.rar
http://www.murmadillo.tut.su/html/me...tton-href.html

Felicast 23.10.2009 22:54

Alex Lexcuk, вы бы сначала мой коммент прочитали, обдумали, а затем бы отвечали.
конечно такой путь возможен, но все-таки правильнее будет
Цитата:

Надо убрать в настройках AS3 галку "Automatically declare stage instances"

etc 24.10.2009 00:37

Alex Lexcuk, надо создавать и отключать автоматическое создание.

TommyLee 24.10.2009 11:51

Почему
Код AS3:

public var knop:SimpleButton;

а не
Код AS3:

public var knop:SimpleButton=new SimpleButton();

?
Без инициализации это же пустая переменная, методов вызвать нельзя и прочее.

etc 24.10.2009 13:40

TommyLee, она инициализируется при компиляции. Т. е. это будет просто ссылка на SimpleButton, находящийся на сцене.

amigomos 24.10.2009 13:51

заработала!!!
 
Всем большое спасибо за помощь!!!
автоматический экспорт кнопки в Action Script я отключил и код:

Код AS3:

package 
{
    import flash.events.MouseEvent;
    import flash.display.DisplayObject;
    import flash.display.MovieClip;
    import flash.display.SimpleButton;
 
    public class Proba extends MovieClip
    {
    public function Proba()
        {
            knop.addEventListener(MouseEvent.MOUSE_DOWN, clickHandler);
        }
    public function clickHandler(e:MouseEvent):void
      {
            trace("Привет!");
      }
    }
}

Работает. ВМЕСТЕ МЫ СДВИНЕМ ГОРЫ!!! :-)

TommyLee 24.10.2009 18:33

Цитата:

Сообщение от etc (Сообщение 860228)
она инициализируется при компиляции

То есть, когда объект создаешь в ide - в коде пишется только ссылка; когда объект создаешь программно - соответственно?

etc 24.10.2009 18:44

Цитата:

Сообщение от TommyLee (Сообщение 860311)
То есть, когда объект создаешь в ide - в коде пишется только ссылка; когда объект создаешь программно - соответственно?

Именно. Ссылка имеет такое же имя, как и объект. Обязательно public.

amigomos 24.10.2009 22:21

Подскажите пожалуйста.
Мне надо использовать много кнопок и др. обьектов. я вот решил попробовать задействовать еще одну кнопку(в редакторе у обоих отключена функция "Экспортировать в AS")
вот код:
Код AS3:

package 
{
    import flash.events.MouseEvent;
    import flash.display.DisplayObject;
    import flash.display.MovieClip;
    import flash.display.SimpleButton;
 
    public class Proba extends MovieClip
    {
        //public var knopkr:SimpleButton;
    public function Proba():void
        {
                        // public var knopkr:SimpleButton = new SimpleButton();
                        knop.addEventListener(MouseEvent.CLICK, btnClickHandler);
                        knopkr.addEventListener(MouseEvent.CLICK, btnClickHandler);
                }
                public function btnClickHandler(evt:MouseEvent)
                {
                        trace("нажал кнопку");
 
                }
        }
}

я пытался создать или обьявить вторую кнопку(но выдавались ошибки и я их закоментировал на время). сейчас , с таким кодом выдаеться ошибка
1120: Access of undefined property knopkr.
ошибка на строчке knopkr.addEventListener(MouseEvent.CLICK, btnClickHandler);
Как мне запустить обе кнопки?

ilor 25.10.2009 00:37

У тебя две кнопки имеют одинаковые названия. А с комментариями ты не объявил knopkr

Felicast 25.10.2009 00:56

во-первых: оформите пожалуйста все свои посты в соответствии с правилами (для оформления кода используйте теги [as3]код[/as3]), а то читать невозможно.
во-вторых: для того чтобы кнопки были видны в коде, нужно задать им instance name. затем последовать совету GAIKER:
Цитата:

Надо убрать в настройках AS3 галку "Automatically declare stage instances"
делать так:
Код AS3:

package 
{
        import flash.events.MouseEvent;
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.display.SimpleButton;
 
        public class Proba extends MovieClip
        {
                public var knop:SimpleButton;        //не надо это комментировать
                public var knopkr:SimpleButton;        //и это тоже
                public function Proba()
                {
                        //здесь кнопки создавать не надо (ибо создано уже все)
                        knop.addEventListener(MouseEvent.CLICK, btnClickHandler);
                        knopkr.addEventListener(MouseEvent.CLICK, btnClickHandler);
                }
                public function btnClickHandler(e:MouseEvent):void
                {
                        trace("нажал кнопку");
                }
        }
}


etc 25.10.2009 02:39

amigomos, отредактируйте свой пост и оформите код тегами [as3][/as3].

Alex Lexcuk 25.10.2009 10:40

Цитата:

Сообщение от GAIKER (Сообщение 860066)
Надо убрать в настройках AS3 галку "Automatically declare stage instances"

Я, понял, у вас у всех глючные Adobe Flash CS(низнаю), а у меня самая правильная (чет неправильных не встречал, они все у вас)
http://www.murmadillo.tut.su/m/autom...-instances.gif

И вот такой код документ класса
Код AS3:

package {
        import flash.display.*;
        import flash.events.*;
 
        public class Doc extends MovieClip{;
 
                public function Doc(){
                        rBtn.addEventListener(MouseEvent.CLICK, btnClickHandler);
                        pBtn.addEventListener(MouseEvent.CLICK, btnClickHandler);
                }
 
                public function btnClickHandler(evt:MouseEvent) {
                        if (evt.target.name=='rBtn') rmc.revPlay();
                        if (evt.target.name=='pBtn') rmc.play();
                }
 
 
        }
}

Работает, две кнопки, и чего бы ему не работать.
http://www.murmadillo.tut.su/m/rev.rar

Wolsh 25.10.2009 11:07

Алекс, Вы не проводите различий между "правильно, в соответствии с международными конвенциями, удобочитаемо и расширяемо" и "работает, и хрен бы с ним" ? Работает-то в обоих случаях. Речь о том, как стóит делать, а как - нет.

Alex Lexcuk 25.10.2009 11:16

Цитата:

Сообщение от Wolsh (Сообщение 860533)
Алекс, Вы не проводите различий между "правильно, в соответствии с международными конвенциями, удобочитаемо и расширяемо" и "работает, и хрен бы с ним" ? Работает-то в обоих случаях. Речь о том, как стóит делать, а как - нет.

Какая конвенция???:wacko:
Правильно весь дизайн запаковать в swc, и закодить во Flex-e все это дело.
А так и че потом писать в коде, типа
Код AS3:

//эти объектынаходятся на сцене
public var btn:SimpleButton;
public var mc:MovieClip;
 
//на мувике mc вставлена кнопка btnPlay
public var btnPlay:SimpleButton;
//кнопка goto2FrameBtn находится во втором кадре таймлайна
public var goto2FrameBtn :SimpleButton;
//конец нарисованным объектам

Бред какой-то, и печать все это, нафик оно надо
и если не снимать галочку, которая стоит по умолчанию (соответствии с международными конвенциями)
Код AS3:

/*эти объекты нарисованы на сцене ручками
public var btn:SimpleButton;
public var mc:MovieClip;
конец нарисованным объектам*/


etc 25.10.2009 12:04

Alex Lexcuk, когда вы начнете писать в нормальном AS3-редакторе, вы поймете, зачем нужно снимать эту галочку. А пока этого в течение ближайших трех лет не произойдет.

wvxvw 25.10.2009 12:42

Alex Lexcuk
Ну, смотрите, мотивы разработчиков Флеша вообще добавить такую возможность вполне понятны:
Флеш, как программа используется в подавляющем большинстве случаев людьми далекими от програмирования. Для них создавать AS файлы для каждого символа в библиотеке было бы очень неудобно. Но это не значит, что именно такой подход правильный для человека, который уже все равно создает эти самые AS файлы. Во Флеше есть еще очень много таких же автоматизаций рассчитаных на не-программистов: MovieClip сделан динамическим классом (хотя это абсолютно лишнее в плане функционала), у него есть "лишний" метод addFrameScript по той же самой причине и т.п.
Каким бы международным и общепризнаным не был бы источник, всегда последнее слово остается за здравым смыслом :) А здравый смысл говорит о том, что если мы хотим, чтобы свойства класса находились редактором кода, нам их нужно объявить.

Alex Lexcuk 25.10.2009 13:01

Цитата:

Сообщение от etc (Сообщение 860548)
Alex Lexcuk, когда вы начнете писать в нормальном AS3-редакторе, вы поймете, зачем нужно снимать эту галочку. А пока этого в течение ближайших трех лет не произойдет.

Если нарисовать все и вложенные кнопки и мувики и дать им instance name, присвоить классы главным объектам (а можно и весь таймлайн сделать как отдельный мувик и дать ему класс), экспортировать все в swc, то потом, Flash Develop (а это редактор) будет высвечивать как всплывающую подсказку, все инстансы вложенных мувиков и кнопок.


Отсюда вывод: ставим все флеш девелоп (весит 4 Метра) и не страдаем фигней.

etc 25.10.2009 13:06

Alex Lexcuk, речь не идёт об автоматической генерации классов. Вы опять нихрена не поняли. Жаль.

wvxvw 25.10.2009 15:18

Цитата:

Сообщение от Alex Lexcuk (Сообщение 860566)
Если нарисовать все и вложенные кнопки и мувики и дать им instance name, присвоить классы главным объектам (а можно и весь таймлайн сделать как отдельный мувик и дать ему класс), экспортировать все в swc, то потом, Flash Develop (а это редактор) будет высвечивать как всплывающую подсказку, все инстансы вложенных мувиков и кнопок.


Отсюда вывод: ставим все флеш девелоп (весит 4 Метра) и не страдаем фигней.

Речь идет не о том, как в дальнейшем использовать, а как использовать изначально ;)
Т.е. если вам нужно добавить какую-то логику в класс прилинкованый к символу из библиотеки, а не просто скомпилировать библиотечный символ с вложеными другими символами.
Наверняка вы захотите описать эту логику с удобством, а возможно, захотите потом использовать этот же класс-файл еще раз где-нибудь. В таком случае полагаться на автоматическое объявление переменных вредно, т.как этих символов в другом случае может просто не оказаться.

Xero201 25.10.2009 20:56

Цитата:

Сообщение от wvxvw (Сообщение 860592)
..если вам нужно добавить какую-то логику в класс прилинкованый к символу из библиотеки

Ага), пока не узнал о фишке "Automatically declare stage instances", делал вообще вот так:
Код:

//object1 - это то-то1
//object2 - это то-то2
//...

Т.к. "это" все же лучше, чем вообще никакой инфы. Теперь наконец-таки перевел эти рукописи в нормальный вид :)

amigomos 27.10.2009 21:00

Почему то все раво ошибка выскакивает :-(
галочку убрал в "Automatically declare stage instances"
код:
Код AS3:

package 
{
    import flash.events.MouseEvent;
    import flash.display.DisplayObject;
    import flash.display.MovieClip;
    import flash.display.SimpleButton;
 
    public class Proba extends MovieClip
    {
        public var knopkr:SimpleButton;
        public var knop:SimpleButton;
    public function Proba():void
                          {
                        knop.addEventListener(MouseEvent.CLICK, btnClickHandler);
                        knopkr.addEventListener(MouseEvent.CLICK, btnClickHandler);
                }
                public function btnClickHandler(evt:MouseEvent):void
                {
                        trace("нажал кнопку");
 
                }
      }
}

ошибку пишет: TypeError: Error #1009: Cannot access a property or method of a null object reference. at Proba()
чего то такой премитивный пример а все никак не получаеться его сделать ((

Felicast 27.10.2009 21:22

вы инстанс нейм прописали для ваших knop и knopkr?

amigomos 27.10.2009 21:35

конечно в свойствах каждой кнопки прописал их названия

Xero201 27.10.2009 23:02

у меня Ваш, amigomos, код работает. Ошибка может возникать, если в реальном примере есть еще какие-то переменные без инстансов.

amigomos 27.10.2009 23:23

обнаружил у себя ошибку... незаметил что не дал название одной кнопке :-(
теперь код работает!!! ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!!!!!!


Часовой пояс GMT +4, время: 08:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.