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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     動的MCの中に動的MCを配置したい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
mittings
Åê¹ÆNo.43504
投稿日時: 2009-9-26 0:12
新米
居住地:
投稿: 4
使用環境:
WinXP,Flash CS4
動的MCの中に動的MCを配置したい
はじめて質問させていただきます。

動的に作成したムービークリップの中に、別のムービークリップを動的に入れるという処理を考えているのですが、上手くいきません。

■プログラムのイメージ

牛の柵や豚の柵を動的に配置(場所が変わったり増えたり減ったり)し、柵の中の牛や豚の数も動的に変化させる。

+--牛の柵---+
|        |
| 牛  牛   |
|        |
+------------+

+--豚の柵---+
|        |
| 豚  豚   |
|      豚 |
+------------+


■問題点

柵を静的に作成しておき、その中に動的に動物を配置することはできます。
しかし動的に作った柵の場合うまく動いてくれません。

ちなみに静的な柵を配置しておく場合のプログラムは、UsiSaku(牛の柵)というムービークリップをaddChildで追加しておいて、n頭のUsiClip(牛)を配置するものです↓

for(var i:int=0; i<n; i++){
var animal_name = "usi"+i;
var Animal:MovieClip = new UsiClip();
UsiSaku.addChildAt(Animal,0);
Animal.name = animal_name;
UsiSaku.getChildByName(animal_name).x = i*100;
}

UsiSakuもgetChildByNameで処理してみたり、色々とやってはみたのですが、動いてくれませんでした。


■動作環境

OS:WindowsXP
Flash:CS4 AS3


よろしくお願いいたします。
ひろゆき
Åê¹ÆNo.43506
投稿日時: 2009-9-26 0:25
ちょんまげら
居住地: 大阪密林
投稿: 3702
使用環境:
10.3.9/10.6.2

CS3/CS4 Pro
Flex 2/3 SDK
Pro8.0
Pro7.2

FlashPlayer
7.0r24/8.0r24/9.0r115/10.0r45
Safari 1.3.2/4.0.4
Firefox 2.0.0.20/3.5.7

MacOS 9.2.2
Flash 4/5
Re: 動的MCの中に動的MCを配置したい
アカウント編集」で、編集環境は書いておきましょう
プロフィール・使用環境記入のお願い
#その他の欄に記入すれば、使用環境として表示されるはずです。


単に「動かない」というのであっても、
「表示されない」のか、
「表示されるが、思うような動きをしない」のか、
「コンパイルエラーが出る」のか、
何がどう動かないのか、説明されないと、
第三者には分かりません。


クラスは大文字、インスタンスは小文字で始めましょう。

var n:uint = 2;
var usiSaku:UsiSaku = new UsiSaku();
addChild(usiSaku);
for(var i:uint = 0; i < n; i++){
	var animal_name:String = "usi"+i;
	var animal:UsiClip = new UsiClip();
	usiSaku.addChild(animal);
	animal.name = animal_name;
	animal.x = 100*i;
}
で、いかがですか?


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

mittings
Åê¹ÆNo.43507
投稿日時: 2009-9-26 0:43
新米
居住地:
投稿: 4
使用環境:
WinXP,Flash CS4
Re: 動的MCの中に動的MCを配置したい
>>mayorさん

ご回答ありがとうございます。
至らぬ点が多々あり申し訳ありません。

「うまくいかない」というのは、エラーが起きて動作がとまってしまうということです。

また、UsiSaku(柵)の「動的」の意味をちゃんとお伝えできていませんでした。

mayorさんの例のように、UsiSakuを
var usiSaku:UsiSaku = new UsiSaku();
addChild(usiSaku);
のようにすればできることは実証済みです。

今回考えているのは「柵の種類がたくさんあり、追加されたり削除されたりする」ものです。
柵の名前を入れるとその柵を動的に作成するような関数をつくり管理したいと思っています。
function SakuAdd(saku_name):void{
  // ここでUsiSakuを作成、配置
}

そうすると、作られた柵の中にMCを入れようとすると、安易に
usiSaku.addChild(animal);
ではエラーになってしまいます。

うまく説明できないのですが、なんとなくお分かりいただけますでしょうか?
ひろゆき
Åê¹ÆNo.43508
投稿日時: 2009-9-26 0:46
ちょんまげら
居住地: 大阪密林
投稿: 3702
使用環境:
10.3.9/10.6.2

CS3/CS4 Pro
Flex 2/3 SDK
Pro8.0
Pro7.2

FlashPlayer
7.0r24/8.0r24/9.0r115/10.0r45
Safari 1.3.2/4.0.4
Firefox 2.0.0.20/3.5.7

MacOS 9.2.2
Flash 4/5
Re: 動的MCの中に動的MCを配置したい
引用:
mittingsさんは書きました:

うまく説明できないのですが、なんとなくお分かりいただけますでしょうか?

上手く説明する必要はありません。
端折らず、説明してください。

少なくとも、現状でのスクリプトを中途半端な省略をせずに記載すべきです。
そのうえで、どのようになさりたいのかを説明した方がよいでしょう。

また「エラー」と一言で片づけてしまうのではなく、
具体的に、どのようなエラーが出ているのか、明確にすべきです。


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

mittings
Åê¹ÆNo.43510
投稿日時: 2009-9-26 1:24
新米
居住地:
投稿: 4
使用環境:
WinXP,Flash CS4
Re: 動的MCの中に動的MCを配置したい
>>mayorさん

ソースは以下となります。

// UsiSaku 柵クラス
// Usi 牛クラス

var saku_array:Array = new Array("Usi","Buta","Yagi","Hitsuzi");

SakuAdd(saku_array[0]);    // 柵を配置
AnimalAdd(saku_array[0],1);  // 動物を配置

function SakuAdd( saku_name ):void{
var sakuClass:Class = Class(getDefinitionByName(saku_name+"Saku"));
var sakuInstance:MovieClip = new sakuClass();
addChild(sakuInstance);
sakuInstance.name = saku_name+"Saku";
}

function AnimalAdd( animal_name, animal_num ):void{
for( var i:int=0; i<animal_num; i++ ){
var animalClass:Class = Class(getDefinitionByName(animal_name));
var animalInstance:MovieClip = new animalClass();
getDefinitionByName(animal_name+"Saku").addChild(animalInstance);
animalInstance.name = animal_name + i;
}
}

柵をSakuAdd()内で作成しているので、AnimalAdd()でエラーになるのでしょうか。


エラーは以下となります。

Attemping to launch and connect to Player using URL C:\***\test.swf
[SWF] C:\***\test.swf - 45795 bytes after decompression
TypeError: Error #1006: addChild は関数ではありません。
at test_fla::MainTimeline/AnimalAdd()[test_fla.MainTimeline::frame1:492]
at test_fla::MainTimeline/frame1()[test_fla.MainTimeline::frame1:479]


よろしくお願いいたします。
野中文雄
Åê¹ÆNo.43511
投稿日時: 2009-9-26 1:56
ちょんまげら
居住地: 東京
投稿: 4247
使用環境:
CS4 .4.11 Vista Home Premium (SP1)
Re: 動的MCの中に動的MCを配置したい
スクリプトは、もっと単純化できるはずです。→【問題を単純化(シンプルに)しない

つぎの2行のスクリプトで、同じエラーが再現されます。クラスとインスタンスを区別できていないことが原因でしょう。
var animalInstance:MovieClip = new MovieClip();
getDefinitionByName("flash.display.MovieClip").addChild(animalInstance);

引用:
mittingsさんは書きました:
function AnimalAdd( animal_name, animal_num ):void{
for( var i:int=0; i<animal_num; i++ ){
var animalClass:Class = Class(getDefinitionByName(animal_name));
var animalInstance:MovieClip = new animalClass();
getDefinitionByName(animal_name+"Saku").addChild(animalInstance);
animalInstance.name = animal_name + i;
}
}

柵をSakuAdd()内で作成しているので、AnimalAdd()でエラーになるのでしょうか。


エラーは以下となります。

Attemping to launch and connect to Player using URL C:\***\test.swf
[SWF] C:\***\test.swf - 45795 bytes after decompression
TypeError: Error #1006: addChild は関数ではありません。
at test_fla::MainTimeline/AnimalAdd()[test_fla.MainTimeline::frame1:492]
at test_fla::MainTimeline/frame1()[test_fla.MainTimeline::frame1:479]


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

野中文雄
Åê¹ÆNo.43513
投稿日時: 2009-9-26 20:55
ちょんまげら
居住地: 東京
投稿: 4247
使用環境:
CS4 .4.11 Vista Home Premium (SP1)
Re: 動的MCの中に動的MCを配置したい
ご質問のスクリプトをもう1度見直してみたところ、「クラスとインスタンスを区別できていない」といより、「インスタンスとインスタンス名」の扱いについて混乱されているといった方がよさそうです。

結論として、インスタンスをインスタンス名で扱うのは、お止めになることをお勧めします。対処法のひとつとしては、関数SakuAdd()からインスタンスの参照を受取り、AnimalAdd()の引数に渡してやることでしょう。

参考: F-site「MovieClipインスタンスとインスタンス名


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

mittings
Åê¹ÆNo.43516
投稿日時: 2009-9-28 21:23
新米
居住地:
投稿: 4
使用環境:
WinXP,Flash CS4
Re: 動的MCの中に動的MCを配置したい
>>Fumioさん

ご回答ありがとうございます。

何分初心者なもので、インスタンスの参照を受け取り、引数に渡すという処理がうまくイメージできません。
しかし試行錯誤の末、初めに書いたスクリプトを動かすことができました。

いくら初心者掲示板とは言え、本当の初心者は書き込んではいけませんね。

>>mayorさん、>>Fumioさん
色々と考えていただき、ありがとうございました。
野中文雄
Åê¹ÆNo.43517
投稿日時: 2009-9-28 22:15
ちょんまげら
居住地: 東京
投稿: 4247
使用環境:
CS4 .4.11 Vista Home Premium (SP1)
Re: 動的MCの中に動的MCを配置したい
「初心者」であることは、何の差支えもありません。ご説明のないのが困るということです。→【初心者なので〜

配列を使い、関数を定義され、forループの構文をお書きになれれば、もはや「初心者」ではないと思います。けれど、どれくらいの知識をもたれ、どこまで処理内容を理解し、どこがおわかりにならないのか具体的に投稿いただかないと、回答者は何をどの程度ご説明すればよいのか見当がつきません。ですから、どうしても抽象的・一般的な答えになってしまうのです。

「インスタンスの参照を受け取り、引数に渡す」というのは、たとえばつぎのように関数からインスタンスの参照を返すということです。
var saku_array:Array = new Array("Usi","Buta","Yagi","Hitsuzi");

// SakuAdd(saku_array[0]);  // 柵を配置
var saku_mc:MovieClip = SakuAdd(saku_array[0]);
// AnimalAdd(saku_array[0],1);  // 動物を配置
AnimalAdd(saku_array[0], 1, saku_mc);

// function SakuAdd( saku_name ):void {
function SakuAdd( saku_name:String ):MovieClip {
	var sakuClass:Class = Class(getDefinitionByName(saku_name + "Saku"));
	var sakuInstance:MovieClip = new sakuClass();
	addChild(sakuInstance);
	// sakuInstance.name = saku_name + "Saku";
	return sakuInstance;
}

// function AnimalAdd( animal_name, animal_num ):void {
function AnimalAdd( animal_name:String, animal_num:int, saku_mc:MovieClip ):void {
	for (var i:int = 0; i < animal_num; i++) {
		var animalClass:Class = Class(getDefinitionByName(animal_name));
		var animalInstance:MovieClip = new animalClass();
		// getDefinitionByName(animal_name + "Saku").addChild(animalInstance);
		saku_mc.addChild(animalInstance);
		// animalInstance.name = animal_name + i;
	}
}

引用:
mittingsさんは書きました:
何分初心者なもので、インスタンスの参照を受け取り、引数に渡すという処理がうまくイメージできません。
しかし試行錯誤の末、初めに書いたスクリプトを動かすことができました。

いくら初心者掲示板とは言え、本当の初心者は書き込んではいけませんね。


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

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

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