0

こんにちは、フラッシャーの仲間です:)

ここ StackOverFlow で提起された最初の質問は、この問題を扱っていました。いくつかの異なるボタンを作成する配列がありました。しかし、私はそれらにアクションを割り当てる方法を知りませんでした: 動的に作成されたボタンのアクションをそれぞれに与える方法 - パート 1

Joel Hooksのおかげで、コードを機能させることができました。ただし、今回はライブラリからインポートしたグラフィックをクラスとして使用する代わりに、グラデーションを描画してムービークリップを作成しています* (jpg をインポートする必要はありませんでした)*。今、私は別の恐ろしい「コンパイル時定数ではありません」というエラーを再び取得しています。クリックまたはロールオーバーされたボタンインスタンスを特定しようとしている方法と関係があると思います。

前のボタン作成(作業)コード:

for (var i:Number=0; i < myXMLArray.length; i++) { navButton=new NavButton ; navButton.name="ボタン" + i; navButton.x=i * navSIZE; navButton.y=navBtnY; navButton.buttonMode=true; thumbsMov.addChild(navButton);

buttons.push(navButton); buttons[i].addEventListener(MouseEvent.MOUSE_UP,handleButtonClick); ボタン[i].addEventListener(MouseEvent.ROLL_OVER,handleButtonOver); buttons[i].addEventListener(MouseEvent.ROLL_OUT,handleButtonOff); }

以前のリスナー(作業)コード:

function handleButtonOver(event:MouseEvent):void {

var button:NavButton = event.target as NavButton; var id:Number = Number(button.name.split("ボタン") 1 ); if(button) TweenLite.to(buttonRolls[id], .4, {alpha:1, ease:Strong.easeOut}); cataText[id].defaultTextFormat = a12Green; cataText[id].text = myXMLArray[id].id; }

現在のボタン作成コード:

for (var i:Number = 0; i < num; i++) {
trace("loop number = "+i);

var blueGradient:MovieClip = new MovieClip();
 blueGradient.name = "button" +i;
 blueGradient.graphics.beginGradientFill(bGrad, bColors, bAlphas, bRatios ,bMatrix)
 blueGradient.graphics.drawRect(0, 0, 266, 40);
 blueGradient.x = i * navSIZE;
 blueGradient.y = navBtnY;
 blueGradient.buttonMode = true;
addChild(blueGradient);

buttons.push(blueGradient)

buttons[i].addEventListener(MouseEvent.MOUSE_UP, handleButtonClick);
buttons[i].addEventListener(MouseEvent.ROLL_OVER, handleButtonOver);
buttons[i].addEventListener(MouseEvent.ROLL_OUT, handleButtonOff);

}

現在のボタン リスナー コード:

function handleButtonOver(event:MouseEvent):void {
var button:blueGradient = event.target as blueGradient;
var id:Number = Number(blueGradient.name.split("button")[1]);
if(blueGradient)
 cataText[id].defaultTextFormat = navFontRoll;
 cataText[id].text = myArray[id].id;

}

次の行がコメントアウトされている場合、現在のムービーはエラーなしでのみ実行されます。

var button:blueGradient = event.target as blueGradient;

それが、コンパイル時定数エラーが発生する原因となっているためです。ただし、その行を削除すると、動的に作成された button0 と button1 という名前の 2 つのボタンではなく、すべてのボタンが button1 になります。

ここでのヘルプやポインタは大歓迎です! 私のコードを見てくれてありがとう。

4

2 に答える 2

2

問題は、blueGradient クラスとボタン オブジェクトを混同していることです。元のハンドラーでは、コードは次のように述べています。

var button:NavButton = event.target as NavButton;
var id:Number = Number(button.name.split("button")[1]);
if(button)....

しかし、あなたの新しいコードでは、

var button:blueGradient = event.target as blueGradient;
var id:Number = Number(blueGradient.name.split("button")[1]);
if(blueGradient)

違いがわかりますか?どちらの場合も、ボタン オブジェクトを「var ボタン」と呼んでいますが、新しいバージョンでは、「button.name.split...」の代わりに「blueGradient.name.split...」と書き、同じあなたの if() ステートメントのために。

var キーワードは、オブジェクトの名前を定義します。構文は var [objectName]:[objectType] です。そのオブジェクトを操作するときは、常に型ではなく名前で参照する必要があります。静的メソッドを持つ静的クラスを持っていない限り、それはもう少し高度です。

要するに、新しいハンドラの 2 つの場所で「blueGradient」を「button」に置き換えると、問題が解決するはずです。それが役に立ったことを願っています!

于 2009-09-25T00:25:15.170 に答える
1

asキーワードはキャスト用であるため、代わりに次の行が必要だと思います。

var button:MovieClip = event.target as MovieClip;

blueGradientクラス名ではなく、変数名のようです。

于 2009-09-23T21:18:09.867 に答える