#1&3です。
よく考えてみますと,#1の書いたエリアではまだ条件が足りませんでした。
●●●
●□●
●●●
という文字の●や□を使うと,#1で書いたようなことになりますが,
実際は,
単純に,□が●の半径分拡大された矩形エリアに●の中心がきた場合に当たったということにはなりませんね。
□が●の半径分拡大された "角丸" 矩形エリアに●の中心がきた場合に当たったということになります。
"角丸" 矩形 の角丸の半径は,● の半径と等しくなりますがこれは難しいです。
とりあえず,
#1で回答した内容までを,
FlashLite 1.0 ,1.1 で検証するの簡単なサンプルを書きます。
簡単と言っても,PC用Flashのように簡単ではありません。
基礎的な検証をするだけでも,かなり大変です。
まず,ステージ上に用意するインスタンスですが,4つのインスタンスを使うことにします。
1.「指令塔」のはたらきをするムービークリップインスタンス
2.キーイベントを受け取るボタンシンボルのインスタンス
3.矩形のムービークリップ:インスタンス名「blue」
4.円形のムービークリップ:インスタンス名「red」
1の「指令塔」ムービークリップと,
2のキーイベントを受け取るボタンはステージ外の見えないようなところに作成します。
1の「指令塔」ムービークリップの中のタイムラインを2フレームにします。
□ レイヤー 筆・・|○|○|
そして,フレーム1に次のように書きます↓。
///////////////////////////////////////////////////////////////
// _root の blue の x座標 を _root の変数 my_x ずつ左右に移動させる
setProperty("/blue", _x, getProperty("/blue", _x)+/:my_x);
// _root の blue の y座標 を _root の変数 my_y ずつ上下に移動させる
setProperty("/blue", _y, getProperty("/blue", _y)+/:my_y);
// 検証のため
setProperty("/blue", _alpha, 100);
//
// _root の blue と red の当たり判定
// 各プロパティ値の変数化
rx = getProperty("/red", _x);
ry = getProperty("/red", _y);
rw = getProperty("/red", _width);
bx = getProperty("/blue", _x);
by = getProperty("/blue", _y);
bw = getProperty("/blue", _width);
bh = getProperty("/blue", _height);
//
if (rx<=bx+bw/2+rw/2) {
if (rx>=bx-bw/2-rw/2) {
if (ry<=by+bh/2+rw/2) {
if (ry>=by-bh/2-rw/2) {
// 検証のため
setProperty("/blue", _alpha, 50);
}
}
}
}
///////////////////////////////////////////////////////////////
そして,フレーム2には次のように書きます↓。
//////////////////
gotoAndPlay(1);
//////////////////
これで,「指令塔」ムービークリップのタイムラインは,
フレーム1 と 2 を繰り返すので,
随時計算処理が行われるようになります。
(gotoAndPlay(1); を書かなければ,フレーム2 の時間がまともにかかるためループ処理が毎フレームにならなくなります。)
if文の内容は,#1で説明した通りの内容です(角丸矩形ではなく単なる矩形です)。
また,
ムービークリップなどのプロパティ(_x や _y など)を得る場合,
そのムービークリップが同じ階層にあれば,ターゲットパスを必要としませんから,
//四角(blue:横移動し円に当たるようにしました)
ax = blue._x; // x 座標
ay = blue._y; // y 座標
のようにしてプロパティを取得しても良いのですが,違う階層になった場合,
ターゲットパスには _root. とか this._parent. だとかいうドットシンタックスが使えません。
スラッシュシンタックスを使う必要がでてきます。
そこで,#2の方が回答していらっしゃるように,getProperty("blue",_height); などが必要になります。
本当の本当は,階層が同じでも getProperty("blue",_height); などとする方が良いです。
こちらの方が文法が統一されて混乱はなくなると思います。
また,
onEnterFrame や onClipEvent (enterFrame) などありませんから,
それを実現できるようにムービークリップでその構造をつくりださなければなりません。
それが フレーム1 と フレーム2 の ムービークリップグルグルループ です。
というか,実は逆で,
ムービークリップグルグルループ は,
onClipEvent (enterFrame) や onEnterFrame などが無い頃の Flash の普通の使い方です。
このしくみをいちいちムービークリップで作らなければならないのが厄介であったため,
ムービークリップに書く onClipEvent (enterFrame) ができたのだと思います。
余計なことを書きましたが,先を続けます。
そして,用意したボタン には次のように書きます↓。
//////////////////////////
on (keyPress "2") {
my_x = 0;
my_y = -2;
}
on (keyPress "6") {
my_x = 2;
my_y = 0;
}
on (keyPress "8") {
my_x = 0;
my_y = 2;
}
on (keyPress "4") {
my_x = -2;
my_y = 0;
}
on (keyPress "5") {
my_x = 0;
my_y = 0;
}
//////////////////////////
これで,_root の 変数 my_x と my_y の値を変えてやります。
携帯では普通はマウスは使えないので,
2,4,5,6,8キー で矩形の blue を動かす方向を決めるものにしてみました。
これが,今で言う Keyクラス のメソッドの代用ですね。
というか,これまた逆で,
ボタンの on (keyPress) の代用が Keyクラス のメソッドなのですが。
これで,適当に配置した blue が動くと同時に,
red に当たると hit が出力されるものができます。
これができて,
やっと単なる検証ができます。
検証してみると,
□と●の当たり判定ではなく,
●を矩形としたものの当たり判定になってしまいます。
というわけです。
以上が,
とりあえず,#1で回答した内容までを,
FlashLite 1.0 ,1.1 で検証する簡単なサンプルです。
================
以下が #1 の解答後,
角丸矩形に関して考え合わせた「指令塔」ムービークリップのタイムライン の フレーム1 のスクリプトです。
//////////////////////////////////////////////////////////////
// _root の blue の x座標 を _root の変数 my_x ずつ左右に移動させる
setProperty("/blue", _x, getProperty("/blue", _x)+/:my_x);
// _root の blue の y座標 を _root の変数 my_y ずつ上下に移動させる
setProperty("/blue", _y, getProperty("/blue", _y)+/:my_y);
//
// 検証のためアルファを使います
setProperty("/blue", _alpha, 100);
//
// _root の blue と red の当たり判定
// 各プロパティ値の変数化
rx = getProperty("/red", _x);
ry = getProperty("/red", _y);
rw = getProperty("/red", _width);
bx = getProperty("/blue", _x);
by = getProperty("/blue", _y);
bw = getProperty("/blue", _width);
bh = getProperty("/blue", _height);
//
if (rx<=bx+bw/2+rw/2) {
if (rx>=bx-bw/2-rw/2) {
if (ry<=by+bh/2+rw/2) {
if (ry>=by-bh/2-rw/2) {
// 検証のため
setProperty("/blue", _alpha, 50);
}
}
}
}
// 円が矩形の右上コーナーにヒットしたとき以外
a1 = rx-(bx+bw/2);
b1 = ry-(by-bh/2);
if (a1*a1+b1*b1>=(rw/2)*(rw/2) && rx>=bx+bw/2 && ry<=by-bh/2) {
setProperty("/blue", _alpha, 100);
}
// 円が矩形の右下コーナーにヒットしたとき以外
a2 = rx-(bx+bw/2);
b2 = ry-(by+bh/2);
if (a2*a2+b2*b2>=(rw/2)*(rw/2) && rx>=bx+bw/2 && ry>=by+bh/2) {
setProperty("/blue", _alpha, 100);
}
// 円が矩形の左下コーナーにヒットしたとき以外
a3 = rx-(bx-bw/2);
b3 = ry-(by+bh/2);
if (a3*a3+b3*b3>=(rw/2)*(rw/2) && rx<=bx-bw/2 && ry>=by+bh/2) {
setProperty("/blue", _alpha, 100);
}
// 円が矩形の左上コーナーにヒットしたとき以外
a4 = rx-(bx-bw/2);
b4 = ry-(by-bh/2);
if (a4*a4+b4*b4>=(rw/2)*(rw/2) && rx<=bx-bw/2 && ry<=by-bh/2) {
setProperty("/blue", _alpha, 100);
}
//////////////////////////////////////////////////////////////
やたら,すごい状態になってしまいましたが,
なんとか,当たり判定は取れているようです。
私の机上の落書きをお見せすることができたら,
図形的に説明ができるのですが,
ここは図形での説明は無理なので,その点は勘弁したください。
数学に強い方だともっとシンプルにできるだろうとは思いますが,
私は数学に弱いので,この辺が限界です。
Flashドキュメンテーション
Flash Lite のグローバル関数 > getProperty
http://livedocs.adobe.com/flash/8_jp/main/00005199.html
Flash Lite のグローバル関数 > setProperty
http://livedocs.adobe.com/flash/8_jp/main/00005226.html
お礼
ご丁寧にありがとうございました。 なんとか作ることができました^^: やはり、考え方等もっと勉強が必要ですね。 教えていただいたことをきちんと理解して次につながるようにしたいと思います。 感謝いたします。 ありがとうございました!