問答収集 カテゴリ:Flashプログラミング
現在のスレッド一覧 / 新規に質問を投稿
レス数:11 / 状態:未解決 / No:96 / ATOM
1 名前:あたり 日付:2012/08/29(水)11:39:34 ID:V7gjm2bAgg+o
actionScript3.0で、動的に配置したムービークリップaと動的に配置したムービークリップbの中にあるムービークリップcの当たり判定がしたいのですかやり方が分かりません。
こちらのサイトで、1.0から2.0の当たり判定の仕方が書いてあったのでそれを頼りに試行錯誤していますが、どうにもうまくいきません。
a.hitTestObject(b.c)
 や
 a.hitTestObject(b.(cのインスタンス名))
 などを試しているのですが、
 「パラメータ.hitTestObjectはnull以外でなければなりません」
 と出てしまいます。
 
どうかよろしくお願いします
2 日付:2012/08/29(水)14:27:40 ID:uqGvQ4UrzKin
>パラメータ.hitTestObjectはnull以外でなければなりません

hitTestObject() メソッドの引数に、 null がセットされていると思います。

「ムービークリップ c 」の取得に失敗しているのではないでしょうか。
出力して確認してみて下さい。
───────────────────────
var my_c;

my_c = b.c;
trace(my_c);

my_c = b.(cのインスタンス名);
trace(my_c);
───────────────────────


「ムービークリップ c 」の取得に成功していれば、
hitTestObject() メソッドの引数に指定するだけです。
───────────────────────
var check:Boolean = a.hitTestObject(my_c);
───────────────────────


「b.c」という表記はドットシンタックスと思います。

ActionScript 3.0 の場合、
Adobe Flash にて静的に配置したオブジェクトであれば、ドットシンタックスを使ってアクセスできますが
動的に配置したインスタンスの場合、ドットシンタックスを使ってアクセスすることはできません。

「ムービークリップ c 」が、静的に配置したものであれば、
インスタンス名の記述に間違いがないか確認してみて下さい。

「ムービークリップ c 」が、動的に配置したものであれば、
すでにインスタンスの参照が得られていると思います。
3 名前:あたり 日付:2012/08/29(水)14:45:46 ID:V7gjm2bAgg+o
ありがとうございます。さっそくやってみます!
4 日付:2012/08/30(木)22:08:55 ID:V7gjm2bAgg+o
すみません。できませんでした。

ムービークリップb:クラス名…hito
  ムービークリップ名…b

ムービークリップc:クラス名…katana
   ムービークリップ名…katana
   インスタンス名…sod

a,bは動的に配置しているので
var hito=new a();
のように書いています。

ムービークリップbの中にムービークリップcが入っている状態です。
何度も申し訳ありません
5 日付:2012/08/30(木)23:38:38 ID:uqGvQ4UrzKin
ムービークリップb のクラス名が "hito" で、
ムービークリップbの中にムービークリップcが静的に格納されていて、
ムービークリップc のインスタンス名が "sod" ということで
───────────────────────
var my_b = new hito();
var my_c = my_b.sod;
───────────────────────
で取得できると思いますがどうでしょうか?
6 日付:2012/08/31(金)00:00:09 ID:uqGvQ4UrzKin
ムービークリップb がタイムラインアニメーションを持っていて
再生フレーム位置によって、ムービークリップc が存在したり存在しなかったりする場合、
getChildByName() メソッドを利用するとよさそうですね。

null が得られれば、ムービークリップc が存在しないので、当たり判定処理を飛ばします。
───────────────────────
// "sod" という名前のインスタンスの取得を試みる
var my_c = my_b.getChildByName("sod");

// インスタンスの取得に成功した
if(my_c){
// 当たり判定を調べる
my_b.hitTestObject(my_c);
}
───────────────────────
7 日付:2012/09/02(日)18:55:10 ID:V7gjm2bAgg+o
すみません。説明が足りなく、ご迷惑をおかけしてしまいました。
教えていただいた方法では、

アクションゲームを作っているのですが、

ムービークリップaはキーイベントで移動するようになっています
フレーム名を上下左右のグラフィックにそれぞれ
nomal(通常)、left,right,up(ジャンプ),kou(攻撃)
とつけていて、キーを押すとそれぞれのフレームに飛ぶようにしています。

ムービークリップcはkou(攻撃)にのみつけています。

何度も申し訳ありません
8 名前:1/3 日付:2012/09/04(火)01:18:37 ID:uqGvQ4UrzKin
まず、>>1 のエラーが発生する問題です。
hitTestObject() メソッドは、引数に null を指定するとエラーとなります。

そこで「if文で事前にチェックする」か、「try-catch 文でエラーを取得する」必要があります。
───────────────────────
if(c){
var check:Boolean = a.hitTestObject(c);
}
───────────────────────
try{
var check:Boolean = a.hitTestObject(c);
}catch(e:Error){
}
───────────────────────
9 名前:2/3 日付:2012/09/04(火)01:19:25 ID:uqGvQ4UrzKin
次に、>>4 の
「ムービークリップb」から、子として静的に配置している「ムービークリップc」を取得する方法です。

"インスタンス名" を指定して、子の表示オブジェクトを取得するには、getChildByName() メソッドを使用します。
引数に、"インスタンス名" を文字列で指定します。

「ムービークリップc」のインスタンス名に "sod" と名前をつけている場合の取得例です。
───────────────────────
var c = b.getChildByName("sod");
───────────────────────
10 名前:3/3 日付:2012/09/04(火)01:23:08 ID:uqGvQ4UrzKin
最後に、>>7 の問題です。

「ムービークリップc」は、「ムービークリップb」の再生位置によって、
存在したり存在しなかったりします。

そこで、hitTestObject() メソッドを呼び出す前に、
毎回「ムービークリップc」の存在を確認する必要があります。
───────────────────────
var check:Boolean = false;

var c = b.getChildByName("sod");
if(c){
check = a.hitTestObject(c);
}
───────────────────────
11 日付:2012/09/04(火)19:57:01 ID:V7gjm2bAgg+o
丁寧にありがとうございます。
何度も質問をしてすみませんでした。
やってみます!本当にありがとうございます!
このスレッドについて
質問の状態 :
未解決
投稿開始日 :
2012/08/29(水)11:39:34
投稿終了日 :
2012/09/11(火)19:57:02
投稿者 :
あたり
レス総数 :
11
スレッド番号 :
96
MondoCollectionSystem ver.0x00020000 by Hakuhin