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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     hitTest(shapeFlag=true)の衝突判定の基準を教えてください
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
RK_Flash
Åê¹ÆNo.39881
投稿日時: 2008-8-12 1:43
新米
居住地:
投稿: 7
使用環境:
----------------
使用環境
WinXP Pro SP2
Pro8.0
ProCS3
FlashPlayer 9,0,124,0(FireFox2)
hitTest(shapeFlag=true)の衝突判定の基準を教えてください
はじめまして。
台形をヒット領域としてhitTestを実行した場合
台形のはじっこあたりと衝突判定を行った時に
trueになる基準がわからない事があったので教えていただけると助かります。

【環境】--------------------------------
・WinXP Pro SP2
・Flash8(パブリッシュはAS2.0)
----------------------------------------

【確認方法】
■テスト用のオブジェクト等を作成します。
1. 正方形のムービークリップインスタンス「point」を作成。x:200、y:200とします。
2. 台形のムービークリップインスタンス「hani」を作成。(正方形を45度回転させたもの)w:200、h:200とします。
3. フレームスクリプトに以下のコードを書きます。
trace(_level0["hani"].hitTest ( _level0["point"]._x , _level0["point"]._y , true ));

■そして、以下のテストをします。
a. 「hani」のxを300にしてムービープレビュー→出力はfalse
b. 「hani」のxを299.4にしてムービープレビュー→出力はfalse
c. 「hani」のxを299.3にしてムービープレビュー→出力はtrue

pointのプロパティ
aの時のhaniのプロパティ
bの時のhaniのプロパティ
cの時のhaniのプロパティ

flaソース

bとcで結果が分かれる理由がわからなかったので、
教えていただけると幸いです。
どうぞ宜しくお願いします。
ひろゆき
Åê¹ÆNo.39882
投稿日時: 2008-8-12 2:20
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: hitTest(shapeFlag=true)の衝突判定の基準を教えてください
引用:
RK_Flashさんは書きました:
bとcで結果が分かれる理由がわからなかったので、
教えていただけると幸いです。

正方形と台形の衝突判定をしているわけではないので、
あくまでも、点と台形の衝突判定。
なので、台形内に、点があれば、true ですし、
台形内に、点がなければ、falseです。

単に、点(200, 200)が、hani 内にあるかないかの違いだと思いますが。

逆に、shapFlag = false の場合、衝突判定は、台形の「境界ボックス」によって行われます。
おそらく、この「境界ボックス」は、計算上、整数値として判定されているように思われますので、
shapFlag = false の場合の方が、誤差があるのではないでしょうか?

また、テストをされるのであれば、
以下のようにテストされても良いように思います。

point の _x は195、 hani の _x は300。

_root 第1フレームに
onEnterFrame = function():Void {
	point._x += 0.1;
	trace([point._x, hani.hitTest(point._x , point._y , false)]);
};
onEnterFrame = function():Void {
	point._x += 0.1;
	trace([point._x, hani.hitTest(point._x , point._y , true)]);
};
onEnterFrame = function():Void {
	hani._x -= 0.1;
	trace([hani._x, hani.hitTest(point._x , point._y , false)]);
};
onEnterFrame = function():Void {
	hani._x -= 0.1;
	trace([hani._x, hani.hitTest(point._x , point._y , true)]);
};

数値の丸め誤差の問題や、プロパティの丸め誤差の問題も含まれているように思います。


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

RK_Flash
Åê¹ÆNo.39892
投稿日時: 2008-8-12 21:58
新米
居住地:
投稿: 7
使用環境:
----------------
使用環境
WinXP Pro SP2
Pro8.0
ProCS3
FlashPlayer 9,0,124,0(FireFox2)
Re: hitTest(shapeFlag=true)の衝突判定の基準を教えてください
mayor様、ご回答ありがとうございました。

引用:
あくまでも、点と台形の衝突判定。

そうですね、正方形に意味はなかったですね。

引用:
逆に、shapFlag = false の場合、衝突判定は、台形の「境界ボックス」によって行われます。
おそらく、この「境界ボックス」は、計算上、整数値として判定されているように思われますので、
shapFlag = false の場合の方が、誤差があるのではないでしょうか?

ご提示いただいたテストをしたところ、おっしゃる通り
shapFlag = false の場合は境界ボックスが整数値のようですね。

【テスト結果】
onEnterFrame = function():Void {
	point._x += 0.1;
	trace([point._x, hani.hitTest(point._x , point._y , false)]);
};

(出力)
 :
199.7,false
199.8,false
199.9,false
200,true
200.1,true
200.2,true
 :

onEnterFrame = function():Void {
	point._x += 0.1;
	trace([point._x, hani.hitTest(point._x , point._y , true)]);
};

(出力)
 :
200.3,false
200.4,false
200.5,false
200.6,true
200.7,true
200.8,true
 :

onEnterFrame = function():Void {
	hani._x -= 0.1;
	trace([hani._x, hani.hitTest(point._x , point._y , false)]);
};

(出力)
 :
295.3,false
295.2,false
295.05,false
294.95,true
294.8,true
294.7,true
 :

onEnterFrame = function():Void {
	hani._x -= 0.1;
	trace([hani._x, hani.hitTest(point._x , point._y , true)]);
};

(出力)
 :
294.55,false
294.45,false
294.3,false
294.2,true
294.05,true
293.95,true
 :


shapFlag = true の場合は、「point」が移動した場合と「hani」が移動した場合とでは、true⇔falseの境目の時のムービークリップ間の距離(幅)が異なっていますね。

試しに、私の投稿時のテストで
「point」のxを200.1、「hani」のxを299.4にしてムービープレビューした場合、出力はfalseになりました。
(「point」のxを200、「hani」のxを299.3はtrueなので不思議ですね)
引用:
数値の丸め誤差の問題や、プロパティの丸め誤差の問題も含まれているように思います。

こちらが関係しているのでしょうね…。

では、どうも有難うございました。
大変勉強になりました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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