3

私はコードの天才ではありませんが、アクション スクリプトのファンです。これについて私を助けてもらえますか:

選択したオブジェクトに応じて、すでにステージ上にある「サブアイテム」のセットにイベント リスナーを呼び出す関数があります (複数のインスタンスと複数のコードを作成する代わりに、クリック時に変更されたパラメーターでこのサブアイテムを再利用したい) )。

したがって、選択した「ケース」ごとに、次のように、これらの「サブアイテム」に異なる変数を渡す必要があります。

function fooMenu(event:MouseEvent):void {
    switch (event.currentTarget.name)
    {
        case "btUa1" :
            trace(event.currentTarget.name);
            // a bunch of code goes here
            //(just cleaned to easy the view)
            /*
            HELP HERE <--
            here is a way to pass the variables to those subitems
            */

            break;
    }
}

function fooSub(event:MouseEvent):void
{
    trace(event.target.data);
    trace(event.currentTarget.name);
    // HELP PLEASE <-> How can I access the variables that I need here ?
}

btUa1.addEventListener(MouseEvent.CLICK, fooMenu);
btUa2.addEventListener(MouseEvent.CLICK, fooMenu);

btTextos.addEventListener(MouseEvent.CLICK, fooSub);
btLegislacao.addEventListener(MouseEvent.CLICK, fooSub);

誰でも私を助けてください。よろしくお願いします。:)

4

2 に答える 2

1

(私はあなたの質問が正しいかどうか確信が持てず、しばらくの間 AS3 で開発していません。)

クリック (またはその他のイベント) で呼び出されるパラメーターを使用して単純に関数を作成する場合は、次のように使用できます。

btUa1.addEventListener(MouseEvent.CLICK, function() {
  fooMenu(parameters);
});

btUa2.addEventListener(MouseEvent.CLICK, function() {
  fooMenu(other_parameters)
}):

public function fooMenu(...rest):void {
  for(var i:uint = 0; i < rest.length; i++)
  {
     // creating elements
  }
}

他の何かに割り当てられたイベントリスナーを呼び出したい場合は、 DispatchEvent を使用できます

btnTextos.dispatchEvent(new MouseEvent(MouseEvent.CLICK))

btTextos.addEventListener(MouseEvent.CLICK, carregaConteudo("jocasta")); は使用できないことに注意してください。Eventlistener を追加するときに渡す 2 番目のパラメーターは関数自体と見なされるため、addEventListener を使用する適切な方法が 2 つあります。

1:

function doSomething(event:MouseEvent):void
{
  // function code
}
element.addEventListener(MouseEvent.CLICK, doSomething); //notice no brackets

2:

element.addEventListener(MouseEvent.CLICK, function() { // function code });

そう:

function fooSub(event:MouseEvent, bla:String):void 
{ 
trace(event.currentTarget.name+" - "+bla); 
// bla would be a clip name. 
} 

codebtTextos.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) { fooSub(e, "jocasta") } ); 

または、コンテンツを動的に生成したい場合は、次のようにしてみてください。

btUa1.addEventListener(MouseEvent.CLICK, function() {
    createMenu(1);
});

btUa2.addEventListener(MouseEvent.CLICK, function() {
    createMenu(2);
});

function createMenu(id):void
{
    // Switching submenu elements
    switch (id)
    {
        case 1:
            createSubmenu([myFunc1, myFunc2, myFunc3]); // dynamically creating submenus in case you need more of them than u already have
            break;
        case 2:
            createSubmenu([myFunc4, myFunc5, myFunc6, myFunc7]);
            break;
        default:
            [ and so on ..]
    }
}

function createSubmenu(...rest):void {
    for (var i:uint = 0; i < rest.length; i++) 
    {
        var mc:SubItem = new SubItem(); // Subitem should be an MovieClip in library exported for ActionScript
        mc.addEventListener(MouseEvent.CLICK, rest[i] as function)
        mc.x = i * 100;
        mc.y = 0;
        this.addChild(mc);
    }
}
于 2012-07-30T17:12:41.203 に答える
0

あなたの質問はかなり曖昧です。どの「変数」を「渡す」必要がありますか?そして、「変数をサブアイテムに渡す」とはどういう意味ですか?通常、「渡す」とは、関数を呼び出すことを意味します。

あなたが正確に何をしようとしているのかをより具体的にすることができれば、それは役に立ちます。それまでの間、ここにあなたが望むものを得るかもしれない3つのことがあります:

角かっこ表記を使用して、任意のオブジェクトの任意のメンバーを取得できます。

var mc:MovieClip = someMovieClip;  
var xVal:Number = mc.x;     // The obvious way
xVal = mc["x"];             // This works too
var propName:String = "x";
xVal = mc[propName] ;       // So does this.

変数を使用して関数を参照できます

function echo(message:String):void { 
    trace(message); 
}
echo("Hello");                      // The normal way
var f:Function = echo; 
f("Hello");                         // This also works

function.applyを使用して、配列内のすべての引数を使用して関数を呼び出すことができます。

// Extending the above example...
var fArgs:Array = ["Hello"];
f.apply(fArgs);    // This does the same thing

これら3つのこと(およびrest別の投稿者が指摘したパラメーター)の間に、非常に柔軟なコードを書くことができます。動的コードには確かにパフォーマンスのコストがかかりますが、呼び出しの頻度が1秒あたり数百回以下である限り、違いに気付くことはありません。

于 2012-07-30T17:15:28.083 に答える