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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     for文での、MovieClip.id=i は、OK、Sprite.id=i は、NGの理由
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
joyko
Åê¹ÆNo.42913
投稿日時: 2009-7-13 10:02
常連
居住地: 埼玉県
投稿: 167
使用環境:
WinXP(SP3)
Flash8 Basic
FlashCS3
Flash CS4
for文での、MovieClip.id=i は、OK、Sprite.id=i は、NGの理由
皆さん、
おはようございます。

環境は、Win XP(SP3)、CS3/AS3です。
【現状】for文内で、i を保管しておく手段として、AS2.0では、MovieClip.id=i; なる方法を、良く使ってました。
AS3.0でもそれが効果あるかを試しましたが、答えは、Yesでした。
そこで、(タイムラインのない、MovieClipとしか
理解してないのですが、)Spriteに対しても、
同じことをしてみたら、答えは、Noでした。
【質問】
・2つは、同じ、DiplayObjectContainerで、
違いは、TimeLineがあるかないかの違いだと理解してますが、
この差が出るのは、何故でしょうか?

以下、MovieClipを使った、テストscriptです。
→mc.idが取得できます。
var max:uint=3;//3つの矩形MCで練習

function makeSquare(target:MovieClip) {//矩形図形描画の関数
	var gr:Graphics=target.graphics;
	gr.lineStyle();
	gr.beginFill(0x000000);
	gr.drawRect(-50,0,100,50);
	gr.endFill();
}

for (var i:uint=1; i<=max; i++) {
	var mc:MovieClip=new MovieClip();
	addChild(mc);
	mc.buttonMode=true;
	mc.name="btn"+i;
	mc.id=i;//このmc.idは、保管される
	mc.x=(stage.stageWidth-mc.width)/2;
	mc.y=10+i*80;
	makeSquare(mc);
	
	mc.addEventListener(MouseEvent.CLICK,onClick);
}

function onClick(e:MouseEvent):void{
	trace(e.target.name+":"+"保存番号は、"+e.target.id+"です");
//予想通り、「btn2:保存番号は、2です」等と表示される
}


これは、Spriteを使った、テストscriptですが、Sprite.idが取得できません。エラーになります。
→SpriteがDynamicでないことを、教えて頂いた後、
配列を使わずに、e.target.nameの数字部分の抽出と
それを数値化して、番号取得の例も記載します。

var max:uint=3;//3つの矩形Spriteで練習

function makeSquare(target:Sprite) {//矩形図形描画の関数
	var gr:Graphics=target.graphics;
	gr.lineStyle();
	gr.beginFill(0x000000);
	gr.drawRect(-50,0,100,50);
	gr.endFill();
}

for (var i:uint=1; i<=max; i++) {
	var sp:Sprite=new Sprite();
	addChild(sp);
	sp.buttonMode=true;
	sp.name="btn"+i;
	//sp.id=i;//このsp.idは、エラーになる→このsp.id=i をコメントアウトすると、正常表示される
	sp.x=(stage.stageWidth-sp.width)/2;
	sp.y=10+i*80;
	makeSquare(sp);
	
	sp.addEventListener(MouseEvent.CLICK,onClick);
}

function onClick(e:MouseEvent):void{
         var spnum:uint=Number(e.target.name.substr(3));//btnの次以降の文字列を抽出し、数値化し、変数 spnumに代入
         trace(e.target.name+":"+"保存番号は、"+spnum+"です");
	//trace(e.target.name+":"+"保存番号は、"+e.target.id+"です");//エラーが出る
	/*「未定義である可能性が高いプロパティに静的型flash.display:Spriteの参照
	を使用してアクセスしてます」と表示されます*/
}


1.MovieClipとSpriteの違いに対する、認識不足があるかと思いますが、その点を教えて頂けると、理解が深まります。

2.正直、AS3.0で登場した、TimeLineのない、Spriteなるものの
使い道が、今一、分かってません。
本によると、「第一フレームで事足りることが、多いので、MovieCLipから派生した、Spriteを新規に提供し、
サイズの増加防止と管理の容易性をprovideする」との事ですが、
既述した事程度でつまずくようでは、
結局、MovieClipを使った方が、何かと、応用が効くような気がしてます。
皆さんは、いかがお考えでしょうか?
野中文雄
Åê¹ÆNo.42914
投稿日時: 2009-7-13 10:33
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: for文での、MovieClip.id=i は、OK、Sprite.id=i は、NGの理由
Spriteクラスはdynamicでないため、プロパティ(変数)を加えることができません。

参考:「rootプロパティでメインタイムラインの関数にアクセスできない

Spriteクラスを使う理由は、軽くて無駄がないから、ということでしょう。

参考: akihiro kamijo「SpliteクラスとMovieClipクラス
引用:
joykoさんは書きました:
1.MovieClipとSpriteの違いに対する、認識不足があるかと思いますが、その点を教えて頂けると、理解が深まります。

2.正直、AS3.0で登場した、TimeLineのない、Spriteなるものの
使い道が、今一、分かってません。
本によると、「第一フレームで事足りることが、多いので、MovieCLipから派生した、Spriteを新規に提供し、
サイズの増加防止と管理の容易性をprovideする」との事ですが、
既述した事程度でつまずくようでは、
結局、MovieClipを使った方が、何かと、応用が効くような気がしてます。

[追記] 対応策としては、dynamicなクラスで別途管理することでしょう。
var max:uint = 3;  // 3つの矩形Spriteで練習
var sprites_array:Array = new Array();

function makeSquare(target:Sprite) {  // 矩形図形描画の関数
	var gr:Graphics = target.graphics;
	gr.lineStyle();
	gr.beginFill(0x000000);
	gr.drawRect(-50,0,100,50);
	gr.endFill();
}

for (var i:uint=1; i<=max; i++) {
	var sp:Sprite=new Sprite();
	addChild(sp);
	sp.buttonMode = true;
	sp.name = "btn" + i;
	sprites_array[getChildIndex(sp)] = i;
	sp.x=(stage.stageWidth-sp.width)/2;
	sp.y = 10 + i * 80;
	makeSquare(sp);

	sp.addEventListener(MouseEvent.CLICK,onClick);
}

function onClick(e:MouseEvent):void {
	// trace(e.target.name+":"+"保存番号は、"+e.target.id+"です");
	trace(e.target.name+":"+"保存番号は、"
	+sprites_array[getChildIndex(Sprite(e.target))]+"です");
}


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

Tonpoo (gaienboy改め)
Åê¹ÆNo.42916
投稿日時: 2009-7-13 10:44
職人
居住地: 東京・神宮前
投稿: 717
使用環境:
Windows 7 Professional,
Flash CS5 Pro,
Flash Player 10,1,102,64
Re: for文での、MovieClip.id=i は、OK、Sprite.id=i は、NGの理由
gaienboyです。その問題の原因は、当該クラスがdynamicクラスなのか否かとい
う点に依存します。ヘルプを見ると、MovieClipクラスはdynamicクラス属性に指
定されていますが、Spriteクラスにはそれが指定されていないことがわかります。

public class Sprite


public dynamic class MovieClip


そして、下記ページの記述をご覧頂くとわかりますが、dynamicクラス属性に指
定されているクラスのインスタンスには、後から任意にプロパティやメソッドを追
加することができますが、そうでないクラスにはそれができません。

ActionScript 3.0 のプログラミング > ActionScript プログラミングの概要 > ActionScript 言語とシンタックス > データ型 > ダイナミッククラス


ちなみにSpriteクラスがdynamicでないというのは私も今知りました(汗)。

メリットデメリットについてはおそらく処理が軽いというようなことが一番だろう
と思います。

※野中先生に先を越されてしまいました(笑)。内容重複しますが、リンク先など
の参考になるかと思うので、このまま投稿します。


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

joyko
Åê¹ÆNo.42917
投稿日時: 2009-7-13 11:03
常連
居住地: 埼玉県
投稿: 167
使用環境:
WinXP(SP3)
Flash8 Basic
FlashCS3
Flash CS4
Re: for文での、MovieClip.id=i は、OK、Sprite.id=i は、NGの理由
野中さん、gaienboyさん、
お二人共、ありがとうございました。
「Sprite=MoviClip-TimeLine」という、定番のaboutな考えで、思考停止してましたので、今回、よ?く、分かりました。
再度、ありがとうございました。

PS:きちんと、ヘルプを読むようにします。

尚、野中さんに配列方式を教えて頂ましたが、Dynamicでない以上は、他の方法もあろうかと、配列を使わない、(少し、姑息かな?)方式で試してみましたが、動くようです。以下がそのscriptです。

var max:uint = 12;// 12個の矩形Spriteで練習
var url_array:Array=new Array();//リンク先格納用の配列生成

function makeSquare(target:Sprite) {// 矩形図形描画の関数
	var gr:Graphics = target.graphics;
	gr.lineStyle();
	gr.beginFill(0x0fffff);
	gr.drawRect(-50,0,100,20);
	gr.endFill();
}

for (var i:uint=1; i<=max; i++) {
	var sp:Sprite=new Sprite();
	addChild(sp);
	sp.buttonMode = true;
	sp.name = "btn"+i;
	sp.x=(stage.stageWidth-sp.width)/2;
	sp.y = -10+i * 30;
	makeSquare(sp);

	//以下は、あっても、なくてもいい各sp上に配置するダイナミックテキスト
	var txt:TextField=new TextField();
	addChild(txt);
	txt.x=sp.x-10;
	txt.y=sp.y;
	txt.text=sp.name;
	txt.mouseEnabled=false;
	
	url_array[i]="http://yahoo.co.jp";//全て、このリンクとした
	
	sp.addEventListener(MouseEvent.CLICK,onClick);
}

function onClick(e:MouseEvent):void {
           e.target.removeEventListener(MouseEvent.CLICK,onClick);
	var spnum:uint=Number(e.target.name.substr(3));//btnの次以降の文字列を抽出し、数値化し、変数 spnumに代入
	trace(e.target.name+":"+"保存番号は、"+spnum+"です"+":"+"数値化検証用の足し算結果="+(spnum+10));
	var req:URLRequest=new URLRequest(url_array[spnum]);
	navigateToURL(req,"_blank");
}
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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