プロが教えるわが家の防犯対策術!

Flash初心者です。
色々と探し回ったのですが、似た問題の解決法が見付けられなかったので質問させて頂きます。

FlashMX2004を使っております。

内容ですが…
rootから数えて4階層下の「hit_area」というムービークリップ自体を変数「this」として、そこから2階層上の、2つ目のフレームラベル「damage」の最初のフレームのムービークリップ(インスタンス名は付けてません)の1階層下の「attack_hit」という関数に引数として渡したいのです。

同じ要領で、rootから数えて4階層下の、同じ「hit_area」を、そこから3階層上の最初のフレームに書かれている「attack_hit」という関数に渡すことは出来ました。

後者のスクリプトは…
onEnterFrame = function() {
_parent._parent._parent.attack_hit(this);
}
です。

これを真似て、前者を…
onEnterFrame = function() {
_parent._parent.damage.attack_hit(this);
}
としてみましたが、うまくいきませんでした。

これで理解して頂けるかわかりませんが、ご理解頂けましたらどうすればよいか教えて下さい。
似たような引渡しが出来れば違う方法でも結構です。

宜しくお願いします。

A 回答 (2件)

ご質問から階層構造を考えると次のようになります。



 _root
  └ムービークリップ 「?1」 - attack_hit ○
    └ムービークリップ 「?2」
      ├ムービークリップ 「?3」 - attack_hit ×
      └ムービークリップ 「?3’」
        └ムービークリップ 「hit_area」

さらに,

> ムービークリップ(インスタンス名は付けてません)の
> 1階層下の「attack_hit」という関数に引数として渡したいのです。

ということですから,
相対パス自体は次のようになります。

_parent._parent.damage.attack_hit(this);
  ↓変更↓
_parent._parent.ムービークリップ 「?3」.attack_hit(this);



少なくとも,
ムービークリップ 「?3」 にはインスタンス名が必要ですね。

それと,

 ↓階層 ↓階層 ↓フレームラベル
_parent._parent.damage.

このような勝手なルールは最初から通じません。
あえて似たようなことをするのでしたら,

_parent._parent.ムービークリップ 「?3」.gotoAndStop("damage");
_parent._parent.ムービークリップ 「?3」.attack_hit(this);

となります。
その時に存在しないオブジェクトになど命令はできません。
関数も,それ以前に定義されていないと実行できません。

この回答への補足

補足と整理をさせて頂きます。

ご回答の通り、ムービークリップに名前を付け、整理したところ…
_root
 └ムービークリップ「char1」
  └ムービークリップ「char」
   ├ムービークリップ「stand_mc」ラベル「stand」(フレーム1)
   ├ムービークリップ「damage_mc」ラベル「damage」
   └ムービークリップ「attack_mc」ラベル「attack」
    └ムービークリップ「hit_area」
となりました。

質問の後に試した場合も入れ、質問の時の例に当てはめると…
_root
 └ムービークリップ「char1」― attack_hit ○
  └ムービークリップ「char」― attack_hit ○
   ├ムービークリップ「stand_mc」― attack_hit ×
   ├ムービークリップ「damage_mc」― attack_hit ×
   └ムービークリップ「attack_mc」
    └ムービークリップ「hit_area」
となりました。

直接「damage_mc」内へ引数が渡せなかったので、フレーム1にある「stand_mc」なら出来るのではと思い、「hit_area」に…
_parent._parent.stand_mc.attack_hit(hit_area);
と書いて試してみましたが、「stand_mc」の中へも入れません。
質問の時に実証済みの通り、階層を上がることは出来ます。
更に、成功した「char1」より余計に1階層上に上がってから「char1」に戻るパスを書いてみると、ちゃんと中へ入ることが出来ました。

補足日時:2008/01/03 18:08
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございました。
若干伝わりきれなかった部分があったためか、うまくいきませんでした。

お礼日時:2008/01/03 18:03

#1です。



一応書かれていらっしゃるような階層構造を作成しました。
そして,
stand_mc の フレーム1 には次のように書き,
------------------------------
function attack_hit(AAA) {
trace(this);
trace(AAA);
}
------------------------------

damage_mc の フレーム1 にも同じく次のように書き,
------------------------------
function attack_hit(AAA) {
trace(this);
trace(AAA);
}
------------------------------

hit_area の フレーム1 には次のように書いて,
------------------------------------------
this.onEnterFrame = function() {
_parent._parent.stand_mc.attack_hit(this);
_parent._parent.damage_mc.attack_hit(this);
delete this.onEnterFrame;
};
------------------------------------------

「制御」→「ムービープレビュー」してみた結果,
一応次の値が出力されました。

出力結果↓
//////////////////////////////////////
_level0.char1.char.stand_mc
_level0.char1.char.attack_mc.hit_area
_level0.char1.char.damage_mc
_level0.char1.char.attack_mc.hit_area
//////////////////////////////////////

パスは合っているようですよ。
ただ,
hit_area の フレーム1 に this.onEnterFrame = function()
を除いて,

_parent._parent.stand_mc.attack_hit(this);
_parent._parent.damage_mc.attack_hit(this);

だけを書いた場合は何も実行されませんでした。
この2行のスクリプトを
今度はフレーム2に移動させれば実行されました。

つまりパスは合っているのですが,
stand_mc と hit_area に function attack_hit が定義されるタイミングが,
hit_area のフレームで実行される attack_hit(this); より遅くなるようです。
この時間差をなんとかすれば(上の場合 onEnterFrame でずらす),
うまく行くと思います。
    • good
    • 0
この回答へのお礼

お手数お掛けしまして申し訳ないです。
ありがとうございます。

パスの問題はクリアとのことなので、あとはタイミング合うように頑張ります。
お世話になりました。

お礼日時:2008/01/05 01:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!