トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     attachMovieしたインスタンスが順番にうすくなってく
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
2kochin3
Åê¹ÆNo.37467
投稿日時: 2008-2-5 1:20
新米
居住地: 神奈川
投稿: 12
使用環境:
winXP
attachMovieしたインスタンスが順番にうすくなってく
プレーヤー7 ActionScript2.0で制作しています。

ボタンクリックで識別子”ata”をステージ上にランダムに配置していき、11個目からは古い順に消しいく。
attachMovieされたインスタンスは古くなるにつれ”alpha”を10%づつ落としていく。といったものを作りたいと思っています。


cnt = 0;
btn.onPress = function() {
	dx = Math.random()*550;
	dy = Math.random()*400;
	_root.attachMovie("ata", "ata"+cnt, cnt+1, {_x:dx, _y:dy});
	ataName = "ata"+cnt;
	_root["ata"+(cnt-10)].removeMovieClip();
	cnt++;
};


として、11個目からは古いものから順に消していくことが出来ました。



cnt = 0;
btn.onPress = function() {
	dx = Math.random()*550;
	dy = Math.random()*400;
	_root.attachMovie("ata", "ata"+cnt, cnt+1, {_x:dx, _y:dy});
	ataName = "ata"+cnt;
	_root["ata"+(cnt-1)]._alpha -= 10;
	_root["ata"+(cnt-2)]._alpha -= 10;
	_root["ata"+(cnt-3)]._alpha -= 10;
	_root["ata"+(cnt-4)]._alpha -= 10;
	_root["ata"+(cnt-5)]._alpha -= 10;
	_root["ata"+(cnt-6)]._alpha -= 10;
	_root["ata"+(cnt-7)]._alpha -= 10;
	_root["ata"+(cnt-8)]._alpha -= 10;
	_root["ata"+(cnt-9)]._alpha -= 10;
	_root["ata"+(cnt-10)].removeMovieClip();
	cnt++;
};


としてそれらしい動きは出来たのですが
こんな書きかたするんでしょうか・・?

もっとスマートな書きかたなどありましたら
どなたかご教示ください。
宜しくお願いいたします。


ひろゆき
Åê¹ÆNo.37468
投稿日時: 2008-2-5 9:09
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: attachMovieしたインスタンスが順番にうすくなってく
var cnt:Number = 0;
btn.onRelease = function():Void {
	var dx:Number = Math.random()*550;
	var dy:Number = Math.random()*400;
	_root.attachMovie("ata", "ata"+cnt, cnt+1, {_x: dx, _y: dy});
	//var ataName:String = "ata"+cnt;
	for (var n:Number = 1; n < 10; n++) {
		_root["ata"+(cnt-n)]._alpha -= 10;
	}
	_root["ata"+(cnt-10)].removeMovieClip();
	cnt++;
};
とか?


----------------
質問する際は、回答者に具体的な情報を与えてください。

野中文雄
Åê¹ÆNo.37469
投稿日時: 2008-2-5 9:11
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: attachMovieしたインスタンスが順番にうすくなってく
forステートメントは、すでに使われていましたよね。その応用で、まとめられるはずです。
引用:
2kochin3さんは書きました:
もっとスマートな書きかたなどありましたら
どなたかご教示ください。

cnt = 0;
btn.onPress = function() {
	dx = Math.random()*550;
	dy = Math.random()*400;
	_root.attachMovie("ata", "ata"+cnt, cnt+1, {_x:dx, _y:dy});
	ataName = "ata"+cnt;
	for (var i:Number = 1; i<10; i++) {
		_root["ata"+(cnt-i)]._alpha -= 10;
	}
	_root["ata"+(cnt-i)].removeMovieClip();
	cnt++;
};

配列も理解されていますよね。配列を利用されれば、存在しないインスタンスに無駄な処理を加える必要がありません。
var cnt:Number = 0;
var mcs_array:Array = new Array();
btn.onPress = function():Void  {
	var dx:Number = Math.random()*Stage.width;
	var dy:Number = Math.random()*Stage.height;
	for (var i:Number = mcs_array.length-1; i>=0; i--) {
		var _mc:MovieClip = mcs_array[i];
		_mc._alpha -= 10;
		if (_mc._alpha<=0) {
			mcs_array.splice(i, 1);
			_mc.removeMovieClip();
		}
	}
	mcs_array.push
	(_root.attachMovie("ata", "ata"+cnt, cnt+1, {_x:dx, _y:dy}));
	ataName = "ata"+cnt;
	cnt++;
};

ステージに配置後のインスタンスの振舞いは、関数(function)を設定して、各々に任せた方がすっきりするように思います。
var cnt:Number = 0;
var mcs_array:Array = new Array();
btn.onPress = function():Void  {
	var dx:Number = Math.random()*Stage.width;
	var dy:Number = Math.random()*Stage.height;
	for (var i:Number = mcs_array.length-1; i>=0; i--) {
		var _mc:MovieClip = mcs_array[i];
		_mc.xFadeOut(i);
	}
	mcs_array.push
	(_root.attachMovie("ata", "ata"+cnt, cnt+1, 
	{_x:dx, _y:dy, xFadeOut:xFadeOut}));
	ataName = "ata"+cnt;
	cnt++;
};
function xFadeOut(i:Number):Void {
	if (this._alpha>10) {
		this._alpha -= 10;
	} else {
		mcs_array.splice(i, 1);
		this.removeMovieClip();
	}
}


----------------
 

ニノミヤ カズノリ
Åê¹ÆNo.37470
投稿日時: 2008-2-5 14:07
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: attachMovieしたインスタンスが順番にうすくなってく
深度を利用してremoveMovieClipメソッドを使わずに書いてみました。
var MAX_NUM:Number = 10;
var cnt:Number = 0;
btn.onPress = function():Void {
	var dx:Number = Math.random() * Stage.width;
	var dy:Number = Math.random() * Stage.height;
	_root.attachMovie("ata", "ata"+cnt, cnt+1, {_x: dx, _y: dy});
	for(var i:Number = 0; i < MAX_NUM; i++) {
		_root["ata" + i]._alpha -= 10;
	}
	cnt = (cnt + 1) % MAX_NUM;
};
追記:確認したらゴミが入っていたので修正しました。
あにぃ
Åê¹ÆNo.37471
投稿日時: 2008-2-5 16:35
職人
居住地: 北海道
投稿: 250
使用環境:
Flash8
FlashCS3
WinXP
FlashLite1.1 / 2.0
Re: attachMovieしたインスタンスが順番にうすくなってく
個人的な書き方で参考になればですが。。。
var cnt:Number = 0;
var ata_array:Array = new Array();
btn.onPress = function() {
    //新規に配置
    ataAttachIN();
    //配置後の処理
    ataFadeOut();
    //次に備えてインクリメント
    cnt++;
};

//
//ここからfunction
//

//新規に配置
function ataAttachIN() {
    var dx:Number = Math.random()*Stage.width;
    var dy:Number = Math.random()*Stage.height;
    ata_array[cnt] = _root.attachMovie("ata", "ata"+cnt, cnt+1, {_x:dx, _y:dy, xFadeOut:xFadeOut})
}

//配置後の処理
function ataFadeOut() {
    //配置されているインスタンスで一番古い物を取得
    var old:Number = cnt - 10;
    //10個配置されていない場合は、値を修正。
    //そうじゃなければ、一番ふるいものを消す。
    if( old < 0 ){
        old = 0;
    }else{
        ata_array[old].removeMovieClip();
    }
    //配置されているインスタンスを徐々に消す
    for( i = old + 1 ; i < cnt ; i++ ){
        ata_array[i]._alpha -= 10;
    }
}
作成とその後の処理は別に書いておきたいこだわりがあるので、
あまり綺麗とはいえないのかもしれません。


----------------
質問する際には、ご自分でできる限り調べてから投稿して下さい

P・S 職人おめでとう。(08/10/09)

2kochin3
Åê¹ÆNo.37476
投稿日時: 2008-2-6 1:26
新米
居住地: 神奈川
投稿: 12
使用環境:
winXP
Re: attachMovieしたインスタンスが順番にうすくなってく
ひろゆきさん


ありがとうございます。

そうですよね。for文で出来ますよね。


書籍のサンプルなどで勉強して理解したつもりで
いざ、さらでスクリプトを書こうとするとまったく応用が利きません。。


日々精進してまいります。
またよろしくお願いいたします。
2kochin3
Åê¹ÆNo.37479
投稿日時: 2008-2-6 15:54
新米
居住地: 神奈川
投稿: 12
使用環境:
winXP
Re: attachMovieしたインスタンスが順番にうすくなってく
野中さん

ありがとうございます。
返信が遅れまして、失礼致しました。

3つもご提示いただき、感謝いたします。


引用:
配列も理解されていますよね。配列を利用されれば、存在しないインスタンスに無駄な処理を加える必要がありません。


2つ目のコードに関して
9回目までは存在しないインスタンスに無駄な処理をしてるわけか?
こうすれば、mcs_arrayに格納されたものを処理する形だから最初の無駄をはぶけるわけですね。
なるほど。


引用:
ステージに配置後のインスタンスの振舞いは、関数(function)を設定して、各々に任せた方がすっきりするように思います。


3つ目のコードに関して
attachMovieの引数、オブジェクトのプロパティを
xFadeOut:xFadeOut

としてる部分が良くわかりません。
こちら、どのように実現しているのか、これから検証したいと思います。

理解したら、また投稿させていただきます。
その折、間違った解釈をしていたら、またよろしくお願いいたします。


2kochin3
Åê¹ÆNo.37480
投稿日時: 2008-2-6 15:59
新米
居住地: 神奈川
投稿: 12
使用環境:
winXP
Re: attachMovieしたインスタンスが順番にうすくなってく
ニノミヤさん

ありがとうございます。
返信遅れまして、失礼いたしました。

質問を投稿した際、ドドっとレスがつき、全て理解してから返信させていただこうと思ったのですが
それではいつまでたってもお礼の返信が出来ないとおもい。。取急ぎご連絡します。

こちら、どのように実現しているか、これから検証したいと思います。


また、よろしくお願いいたします。
2kochin3
Åê¹ÆNo.37482
投稿日時: 2008-2-6 16:04
新米
居住地: 神奈川
投稿: 12
使用環境:
winXP
Re: attachMovieしたインスタンスが順番にうすくなってく
あにぃさん

ありがとうございます。
返信遅れまして、失礼いたしました。


コメント入りで、わかりやすくご解説頂き感謝いたします。
大変参考になりました!



また、よろしくお願いいたします。
野中文雄
Åê¹ÆNo.37483
投稿日時: 2008-2-6 16:13
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: attachMovieしたインスタンスが順番にうすくなってく
下記のサンプルスクリプトで、確認されるとよいでしょう。
引用:
2kochin3さんは書きました:
attachMovieの引数、オブジェクトのプロパティを
xFadeOut:xFadeOut

としてる部分が良くわかりません。

var nTest:Number = 1;
var initObject:Object = {_x:100, myVariable:nTest, myFunction:xTest};
var _mc:MovieClip = 
_root.attachMovie("ata", "ata", _root.getNextHighestDepth(), initObject);
function xTest():Void {
	trace(this);
}
_mc.myFunction();

[デバッグ] > [変数のリストアップ]より引用:
変数 _level0._mc = [ムービークリップ:_level0.ata]
ムービークリップ: ターゲット="_level0.ata"
変数 _level0.ata.myFunction = [関数 '']
変数 _level0.ata.myVariable = 1


なお、配列の処理をforステートメントで降順に行っていることも、ポイントのひとつです。昇順に処理すると、漏れが生じてしまうからです。
引用:
こうすれば、mcs_arrayに格納されたものを処理する形だから最初の無駄をはぶけるわけですね。


----------------
 

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops