
こんにちは。
actionscript3.0にて制作をしております。
FLASH CS4上にテキストフィールドが入ったムービークリップが予め作成してあり、
それを「box_mc」という名前でライブラリに登録しております。
box_mcを配列に格納し、それぞれにマウスイベントで横に10移動する処理を割り当てたく
下記の様な文法で作成しましたが、ランタイムエラー「#1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」とエラーが表示されてしまいます。
それぞれの配列に正しくマウスイベントを割り当てるにはどうしたら良いでしょうか?
var boxArray:Array = new Array();
for (var i:int = 0; i < 3; i++) {
boxArray[i] = new box_mc();// ボックス
// マウスオーバーイベント
boxArray[i].addEventListener(MouseEvent.MOUSE_OVER, function (event:MouseEvent):void {
boxArray[i].x = 10;
});
}
お手数では御座いますが、ご教授いただけると幸いです。
宜しくお願い申し上げます。
No.3ベストアンサー
- 回答日時:
#1の方と同じような内容ですが,
こんな感じで良いのではないでしょうか (コピペ可↓)。
--------------------------------
var boxArray:Array = new Array();
for (var i:int = 0; i < 3; i++) {
boxArray[i] = new box_mc();
addChild(boxArray[i]);
boxArray[i].y = 20*i;
boxArray[i].addEventListener(MouseEvent.MOUSE_OVER, function (event:MouseEvent):void {
// ★↓ここを変更
event.currentTarget.x += 10;
});
}
// ★↓こうして確認してみれば?
trace("「i」の値は?→" + i);
--------------------------------
「制御」→「ムービープレビュー」で動作確認します。
↑これでどこが原因かわかりますか?
for文 を抜けた後,
変数「i」の値は 3 になるのです。
for文 によって boxArray の中の要素(box_mc参照変数)は,
boxArray[0],boxArray[1],boxArray[2] の 3つしかできませんよね?
つまり boxArray[i] つまり boxArray[3] など存在ません。
各ムービークリップに人間がロールオーバーする頃など,
for文 などとっくに抜けきっていて,「i = 3」 で止まっています。
したがって書かれていらっしゃる
> boxArray[i].x = 10;
だと,どのムービークリップにロールオーバーしようとも,
boxArray[3] を 10px に移動させようとします。
だから
「null のオブジェクトを参照してます(そんなものありませんで!)。」
というエラーが出るのです。
No.2
- 回答日時:
John12345さん、
それぞれのインスタンスを独立して動かしたいということなので、こういうことかと思います。
//ここから
var boxArray:Array = new Array();
var nTarget:Number=stage.stageWidth/2;//ステージ中央値
for (var i:int = 0; i < 3; i++) {
var flag:Boolean=false;//動かすかどうかの制御変数定義
boxArray.push(flag);//配列に、flagを格納し、
var mc:Box_mc=new Box_mc();// ボックスのインスタンを生成
addChild(mc);//表示し、
mc.id=i;//iをmcに動的に作ったプロパティ idに格納しておく
mc.mouseChildren=false;//mcに入れ子になった、ダイナミックテキスト _txtをマウスに反応させないようにしておく
mc._txt.text=String(i);//_txtにiを記載
mc.y=i*80;//mcのY軸方向の配置、適当です
mc.addEventListener(MouseEvent.MOUSE_OVER,xMove,false,0,true);
mc.addEventListener(Event.ENTER_FRAME,xEnterframe,false,0,true);
}
function xMove(e:MouseEvent):void {
boxArray[e.target.id]=true;//それぞれのe.target.id番目のflagをtrueとする
e.target.nextFrame();//第二フレームに移動して、色を変化させる→box_mcを2フレームで作っておき、第一フレームには、this.stop();と記載
}
function xEnterframe(e:Event):void {
if (boxArray[e.target.id]) {//e.target.idで配列からflagを取り出し、それが、trueなら、
e.target.x+=(nTarget-e.target.x)/10;//ステージ中央に向かって、目標接近スクリプトで動かす
}
if (e.target.x>(nTarget-1)) {//ステージ中央から1pxl以内に突入したなら、(永遠に、中央値にはならないので)
e.target.removeEventListener(Event.ENTER_FRAME,xEnterframe);//削除
}
trace(e.target.x);//検証用
}
//ここまで
No.1
- 回答日時:
var boxArray:Array = new Array();
for (var i:int = 0; i < 3; i++) {
boxArray[i] = new box_mc();// ボックス
// マウスオーバーイベント
boxArray[i].addEventListener(MouseEvent.MOUSE_OVER, function (event:MouseEvent):void {
event.target.x = 10;
});
}
僕も初めてわかったんですが、イベントリスナーの引数の関数のなかは
名前空間が別になっているみたいですね
ということでevent.targetで対象をとるようにすれば問題なくいけるみたいです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
potplayerについて質問です
-
chrome flash
-
FLASHの再生はできないのでしょ...
-
uwscでExcelに自動記入
-
PHPの変数をAS3に渡す方法
-
FLASHでゲームを作っていた人は...
-
この曲はなんでしょう?
-
laptop go2からの買い替え、lap...
-
スクリップト
-
私のコンピューター上のファイ...
-
arduino プログラムについて
-
フラッシュゲームアーカイブ2
-
ウェブサイトで Flash が事実上...
-
Flashコンテンツを使ったWebサイト
-
Flash Playerのサポートが終了
-
Form内のselectを連動させるに...
-
Flashをブロックしないで
-
ダウンロードしたデジブックはa...
-
ad or script について
-
Flashplayerの運用について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
for文を使ったボタン
-
AS3.0で地面にバウンドするよう...
-
VBAユーザーホームテキストボッ...
-
変数に256文字以上のテキストを...
-
VB6.0で、フォームから、別のフ...
-
四乗根を英語で言うと・・・
-
photoshopで書いた四角の枠の中...
-
python ボタンを押すと複数の関...
-
テキストボックスの中身をリセ...
-
【VB.NET】別Formのボタンが押...
-
マウス自体の移動量の取得
-
VBAで改行の入ったデータの正規...
-
UWSCのBTN関数について。
-
テキストボックスにセルの値を...
-
FLASHで脱出ゲームを作る時の、...
-
テキストエリア内の文字列にリ...
-
VBScriptでMsgBoxのYesNoボック...
-
arduino プログラムについて
-
ZWCAD CUIXとLISPの関係について
-
DataTableの件数を取得したい
おすすめ情報