PDA

Просмотр полной версии : public static function


Dr_Bra
20.10.2010, 12:05
Всем привет!

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

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
(root as MovieClip)

Dr_Bra
20.10.2010, 14:08
спасибо

Добавлено через 2 часа 53 минуты
во всем приложении что бы обратиться к методу или свойству использовал такой вид
public static var num:String
и из другого класса обращался к нему
Название Класса.num = значение
но в моем случае мне посоветовали избегать static
пришлось все менять и теперь не так просто обрфщаться к свойствам главного класса из дополнительных

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

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

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


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

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 минут
(this.root as Main)["f1"].alpha = 0;это конечно не выполняется, все что ниже то же не выполняется.
а ругается так:

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
почитал у Мука про статические методы и свойства, да действительно в моем случае их применять не стоит.
Поправил код, учитывая комментарий, но по прежнему та же самая ругань


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);
}
}
}

nOobCrafter
21.10.2010, 12:16
вы пишише на ас3, так и используте возможности этого языка, на данном этапе у вас ас2шный подход, так вы только больше гемороя получите.

Dr_Bra
21.10.2010, 12:36
как бы учусь, не в полной мере понимаю все возможности as3 и преимущества, если можно дайте более конкретный коммент.

сейчас у меня 3 класса:
Main
Food
Friend

а смысл такой: нужно перетаскивать еду на друзей, когда каждый друг получил кусочек – ура, пакшот, финальные титры!)

Obi
21.10.2010, 12:54
Я в свое время реализовывал дрэгменеджер следующим образом:

Тот, на кого можно перетаскивать предмет реализует интерфейс IAccepter в котором, грубо говоря, есть метод dropHandler(object:IDraggableObject), который вызывается DragManager'ом.

DragManager — синглтон.

У DragManager'a регистрируются все объекты, которые хотят реагировать на перетаскивание на них объекта, и все объекты, которые должны быть перетаскиваемыми.

IAccepter'ов он подписывает, грубо говоря, на MOUSE_UP.
Перетаскивание IDraggableObject'ов рулит тот-же DragManager, startDtag(), stopDrag() и прочее.

Когда начинается перетаскивание, дрэгменеджер записывает ссылку на перетаскиваемый объект (_activeDraggableObject), и при срабатывании у IAccepter'а MOUSE_UP, вызывает функцию IAccepter.dropHandler, передавая в нее сохраненную ссылку на текущий перетаскиваемый объект.

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

Естественно, описание упрощенное.
Возможно и не лучшее решение, но мне было с ним вполне комфортно и удобно жить :)

Dr_Bra
21.10.2010, 13:00
Как считаете, обойтись без синглтона здесь возможно?

Я еще не накопил достаточно "маны"), не разу не использовал синглтон, поэтому для меня это сложновато.

Obi
21.10.2010, 13:04
Как считаете, обойтись без синглтона здесь возможно?

Я еще не накопил достаточно "маны"), не разу не использовал синглтон, поэтому для меня это сложновато.

Ну синглтон он для удобства, чтобы можно было обратиться к нему из любого IAccepter'a и IDraggebleObject'a, но можно и пробрасывать ссылку на этот менеджер любому из них.

Dr_Bra
21.10.2010, 13:11
сейчас получается так:
мы схватили "еду", тащим ее на "друга", срабатывает метод over, но но 50 строка не выполняется

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



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;// ругается на эту строку
}
}

}

}

}

nOobCrafter
21.10.2010, 13:54
в вашем случае роль манагера может выполнять класс Main т.к. логика по контролю перетягиваемых обьектом описана там. Вам просто расказали про универсальный подход, а делать вы можете как вам удобнее.

Obi
21.10.2010, 14:15
сейчас получается так:
мы схватили "еду", тащим ее на "друга", срабатывает метод over, но но 50 строка не выполняется

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



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

Dr_Bra
21.10.2010, 14:36
проблема в классе Friend, не могу правильно задать условие и обратиться к нужным объектам на сцене.
Немного объясню что в fla:
кусочек курицы f1_mc перетаскиваем на самого левого "кудрявого" друга.
этот кусок должен исчезнуть, "кудрявый" друг перестать реагировать на ROLL_OVER и внутри друга должен появиться красный пар (s1.alpha = 1)

архив тут: http://***********/19875011

Добавлено через 24 минуты
я вот так вот переделал класс Friend

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 static var _y:int;
private var myTween:Tween;

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))
{
switch((this.root as Main).currentDragged)
{
case "f1_mc":
(this.root as Main).piple = this.name;
(this.root as Main).f1.alpha = 0;
stopFriend();
break;

case "f2_mc":
(this.root as Main).piple = this.name;
(this.root as Main).f2.alpha = 0;
stopFriend();
break;

case "f3_mc":
(this.root as Main).piple = this.name;
(this.root as Main).f3.alpha = 0;
stopFriend();
break;
}
}
}
}

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);
(this.root as Main).num ++;
//trace((this.root as Main).num)

if((this.root as Main).num == 3)
{
trace("!!!!!!!!!!!!!!!!!!!!!")
(this.root as Main).allRight();// эх запустить бы этотметод!!!

}
}
}
}












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

Добавлено через 1 час 54 минуты
а есть какой - нибудь другой способ вызвать метод

(this.root as Main).allRight();

может не совсем правильный, но что бы заработало?)

Добавлено через 4 часа 13 минут
нужно было завести статическое свойство и через него обращаться
типо:

//в главном классе
public static var instanc:Main;
//...
instanc = this;



и из дополнительного обращаться так:

Main.instanc.allRight();