Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   public static function (http://www.flasher.ru/forum/showthread.php?t=145809)

Dr_Bra 20.10.2010 12:05

public static function
 
Вложений: 1
Всем привет!

у меня есть метод :
Код AS3:

public static function allRight():void
                {
                        if(num == 3)
                        {
                                trace("All right")
                                //gotoAndPlay("finish");
                        }
                }

почему gotoAndPlay("finish"); не может сработать?

dimarik 20.10.2010 12:09

Потому что это статический метод класса, а у класса MovieClip, как объекта, нет метода gotoAndPlay(). Этот метод есть у объектов, инстанцированных от класса MovieClip.

Obi 20.10.2010 12:12

Можно, например, передать в функцию allRight ссылку на мувиклип, у которого надо вызвать gotoAndPlay, тогда все будет хорошо.

Dr_Bra 20.10.2010 12:14

а если нужно перескочить на на главном таймлайне?

Obi 20.10.2010 12:21

Главный таймлайн тоже мувиклип.

Dr_Bra 20.10.2010 12:23

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

Obi 20.10.2010 12:25

Код AS3:

(root as MovieClip)


Dr_Bra 20.10.2010 14:08

спасибо

Добавлено через 2 часа 53 минуты
во всем приложении что бы обратиться к методу или свойству использовал такой вид
Код AS3:

public static var num:String

и из другого класса обращался к нему
Код AS3:

Название Класса.num = значение

но в моем случае мне посоветовали избегать static
пришлось все менять и теперь не так просто обрфщаться к свойствам главного класса из дополнительных

Добавлено через 2 часа 57 минут
вот, например, есть класс Friend, в нем описывается функционал людей, на сцене будет 3 экземпляров этого класса.

в классе Friend есть метод:
Код AS3:

this.addEventListener(MouseEvent.ROLL_OVER, over, false, 0, true);

Добавлено через 3 часа 5 минут
наводим курсор на экземпляр класса Friend и этот экземпляр должен отработать такой вот функционал:
Код AS3:

private function over(e:MouseEvent):void
                {
                        if((this.root as Main)['take'] == true)//здесь take свойство главного класса, которое верно.
                        {                               
                                myTween = new Tween(this, "y", Strong.easeOut, _y, _y-45, 5, false);
                                myTween.addEventListener(TweenEvent.MOTION_FINISH, tweenFinishd, false, 0, true);
                                this.gotoAndStop(2);//наш "друг" прыгает и меняет кадр на второй
 
                                if((this.root as Main)["cursor"].hitTestObject(this))//условие верно
                                {       
 
                                        //  условие для 1-го кусочка
                                        if((this.root as Main)['currentDragged'] == "f1_mc")//верно
                                        {       
                                                piple = this.name;
                                                trace(piple)// выводит p1_mc
                                                (this.root as Main)["f1"].alpha = 0;// на эторугается! Почему?
 
                                                if(piple == "p1_mc")
                                                {
                                                        trace((Main)['currentDragged'])
 
                                                        (this.root as Main)["s1"].alpha = 1;
                                                        (this.root as Main)["s1"].gotoAndPlay(2);
                                                        (this.root as Main)["p1"].stopFriend();
 
                                                        (this.root as Main)["num"] ++;
                                                        (this.root as Main).allRight();
                                                }

Добавлено через 3 часа 8 минут
Код AS3:

(this.root as Main)["f1"].alpha = 0;

это конечно не выполняется, все что ниже то же не выполняется.
а ругается так:
Код AS3:

TypeError: Error #1006: value is not a function.
        at com::Friend/over()[/Volumes/work/Projects/KFC/KFC-202477/banner_800x250/com/Friend.as:48]


Obi 20.10.2010 21:29

Цитата:

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

Ну и преведение типов нужно для того, чтобы компилятор не ругался на обращение к несуществующему свойству, считая объект не тем, кем он есть :)
(this.root as Main)['currentDragged'] – надо было писать так: (this.root as Main).currentDragged

А на обращение ['someField'] компилятор так и так не ругнется, так что можно (НЕЛЬЗЯ!) писать this.root['someField']

Dr_Bra 21.10.2010 12:00

почитал у Мука про статические методы и свойства, да действительно в моем случае их применять не стоит.
Поправил код, учитывая комментарий, но по прежнему та же самая ругань

Код AS3:

package com
{
        import com.Food;
        import com.Main;
 
        import fl.transitions.Tween;
        import fl.transitions.TweenEvent;
        import fl.transitions.easing.*;
 
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Friend extends MovieClip
        {
                private var _y:int;
                private var myTween:Tween;
                public var piple:String;
 
                public function Friend()
                {
                        this.addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init (e:Event):void
                {       
                        _y = this.y;
                        this.addEventListener(MouseEvent.ROLL_OVER, over, false, 0, true);                       
                }
 
                private function over(e:MouseEvent):void
                {
                        if((this.root as Main).take == true)
                        {                               
                                myTween = new Tween(this, "y", Strong.easeOut, _y, _y-70, 5, false);
                                myTween.addEventListener(TweenEvent.MOTION_FINISH, tweenFinishd, false, 0, true);
                                this.gotoAndStop(2);
 
                                if((this.root as Main).cursor.hitTestObject(this))
                                {       
 
                                        //  условие для 1-го кусочка
                                        if((this.root as Main).currentDragged == "f1_mc")
                                        {       
                                                piple = this.name;
                                                (this.root as Main).f1.alpha = 0;
 
                                                if(piple == "p1_mc")
                                                {
                                                        trace((this.root as Main).currentDragged)//почему - то выводит сразу 2 одинаковых имени ("f1_mc" - этот объект был наведен на экземпляр Friend)
                                                        (this.root as Main).s1.alpha = 1;// ругается на эту строку
//                                                        (this.root as Main).s1.gotoAndPlay(2);
//                                                        (this.root as Main).p1.stopFriend();
//                                                       
//                                                        (this.root as Main).num ++;
//                                                        trace((this.root as Main).num)
//                                                        //(this.root as Main).allRight();
                                                }
                                        }
 
                                }
 
                        }
 
                }
 
                private function tweenFinishd(e:TweenEvent):void
                {
                        myTween = new Tween(this, "y", Strong.easeIn, this.y, _y, 5, false);
                        myTween.addEventListener(TweenEvent.MOTION_FINISH, shutUp, false, 0, true);
                }
 
                private function shutUp(e:TweenEvent):void
                {
                        this.gotoAndStop(1);
                }
 
                public function stopFriend():void
                {                       
                        this.removeEventListener(MouseEvent.ROLL_OVER, over);
                }
        }
}



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

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