質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flash

Flashは、Webページにアニメーション、ビデオ、また対話型のアプリケーションを埋め込むためにAdobe社が提供しているクロスプラットフォームのインターネットマルチメディアランタイムです。

ActionScript 3

ActionScript 3 (AS3)はAdobe FrashとAIRプラットフォームによる、オープンソースかつオブジェクト指向のプログラミング言語です。AS3はRIA、モバイルアプリケーション、デスクトップアプリケーションなど広く使われます。

Q&A

解決済

1回答

605閲覧

【ActionScript 3.0】 removeChildの使い方

mymsmpb_love

総合スコア13

Flash

Flashは、Webページにアニメーション、ビデオ、また対話型のアプリケーションを埋め込むためにAdobe社が提供しているクロスプラットフォームのインターネットマルチメディアランタイムです。

ActionScript 3

ActionScript 3 (AS3)はAdobe FrashとAIRプラットフォームによる、オープンソースかつオブジェクト指向のプログラミング言語です。AS3はRIA、モバイルアプリケーション、デスクトップアプリケーションなど広く使われます。

0グッド

0クリップ

投稿2018/11/27 06:48

いま、AS3でスロットを製作しております。
その際に、リールのループを行いたくて、MCのYが値に達したら、removeChildして、次の柄を生成したいと思っています。
エラーコードをなくしたいのですが、エラーコードをなくそうとすると、ちゃんと動作してくれなくなります。

解決方法、またはいい方法ないでしょうか。

AS3

1var seven:MovieClip = new seven_mc(); // 7 2var jack:MovieClip = new jack_mc(); // ジャックポット 3var pierrot:MovieClip = new pierrot_mc(); // ピエロ 4var watermelon:MovieClip = new watermelon_mc(); // スイカ 5var watermelon2:MovieClip = new watermelon_mc(); // スイカ2 6var bell:MovieClip = new bell_mc(); // ベル 7var replay:MovieClip = new replay_mc(); // リプレイ 8var replay2:MovieClip = new replay_mc(); // リプレイ2 9var cherry:MovieClip = new cherry_mc(); // チェリー 10var mc_array:Array = [seven, jack, pierrot, watermelon, watermelon2, bell, replay, replay2, cherry]; // 役一覧 11 12// リール一覧///////////////////////////////////////////////////////////////// 13var reel1:Array = [bell, seven, replay, watermelon, replay2, watermelon2 , jack, cherry, watermelon, replay, watermelon2, seven, pierrot, watermelon, replay, watermelon2, cherry, jack, watermelon, replay, watermelon2]; 14var reel2:Array = [replay, seven, watermelon, cherry, pierrot, replay, jack, watermelon, cherry, replay, bell, watermelon, cherry, replay, jack, watermelon, cherry, replay, bell, watermelon, cherry]; 15var reel3:Array = [replay, seven, jack, bell, replay, watermelon, pierrot, bell, replay, watermelon, pierrot, bell, replay, watermelon, pierrot, bell, replay, watermelon, pierrot, bell, replay]; 16////////////////////////////////////////////////////////////////////////////// 17 18var center:Number = 312.5; // 真ん中の座標 19var mc_height:Number = 300; // リールの横幅 20var speed:Number = 50; // 回転速度 21 22// (試し)Object生成/////////////////////////////////// 23addChild(seven); // 召喚 24seven.x = center; // 座標設定 25 26addChild(jack); // 召喚 27jack.x = center; // 座標設定 28jack.y = seven.y - mc_height; // 座標設定 29 30addChild(pierrot); // 召喚 31pierrot.x = center; // 座標設定 32pierrot.y = jack.y - mc_height; // 座標設定 33//////////////////////////////////////////////////////// 34 35// ENTER_FRAME ///////////////////////////////////////// 36stage.addEventListener(Event.ENTER_FRAME, function(){ 37 38 for each(var mc in mc_array) //役一覧すべてを確認 39 { 40 mc.y += speed; // y座標をコントロール 41 42 if(mc.y >= 910){ // 当たっていたら 43 mcCreate(mc); 44 break; 45 } 46 } 47 48}); 49//////////////////////////////////////////////////////// 50 51// Object生成/////////////////////////////////////////// 52function mcCreate(mc):void 53{ 54 mc.y = -1000; 55 removeChild(mc); 56} 57////////////////////////////////////////////////////////
エラーコード
ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。 at flash.display::DisplayObjectContainer/removeChild() at SlotGame_fla::MainTimeline/mcCreate() at MethodInfo-2()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

かなり前の質問なので、もう解決しているかもしれませんが、他の人の役に立つかもしれませんので……。

まず、エラーの内容ですが、このメッセージが出ているということはつまり……
指定した DisplayObject は呼び出し元の子ではない という意味です。

removeChild(mc)
この文脈では、指定したDisplayObjectとはmcのことであり、呼び出し元とはメインタイムラインのことです。

例えば、removeChild() は同じ引数を指定して、連続で呼び出すことはできません。やろうとするとエラーが出ます。

Action

1var sprite:Sprite = new Sprite(); 2var child:Sprite = new Sprite(); 3 4//まず sprite の子リストに child を加えてみます。 5sprite.addChild(child); 6 7//当然 child は sprite の子として登録されていますので、リムーブも可能です。 8sprite.removeChild(child);  9 10//しかし……もう一度実行しようとすると…… 11sprite.removeChild(child); 12 13//↑この removeChild() はエラーになる。 14//何故なら、上の行で child はリムーブ済みとなっています。 15// 既に sprite の子リストには child は存在しないのです。

長々とエラーが出る原因を語ったところで、対処法です。
mcの親(parent)とremoveChildの呼び出し元が一致するか否かを判定してから処理しましょう。mcCreateメソッドの部分を……

Action

1function mcCreate(mc):void 2{ 3 if(mc.parent == this){ 4 removeChild(mc); 5 } 6 mc.y = -1000; 7}

軽くコードを動かしてみてこんな感じに修正したらいいんじゃないかと思いました。

mc.parent というのは 、mc を表示リストに保持している親オブジェクトのことです。addChild()メソッドの実行主です。

このエラーでつまづくのは、クラスとかの理解がフワッとしてて曖昧なのかもしれません。あるプログラムを複数のクラスで機能分割して開発をしてみたりすると、今回のようなエラーもどういうことを言っているのかより良く理解できるようになるんじゃないでしょうか。

以上 昔、同じエラーメッセージに呪いの言葉を吐いていた人間の意見でした☆

投稿2019/07/22 14:35

Isrsm

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問