• 締切済み

FLASHの当たり判定での点数

BlurFiltanの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

> 以下のような書き方だと > オブジェクトAがオブジェクトBに入っている間 > ずっとpointが+1されてしまいます。 それは 書かれていらっしゃるスクリプトの部分に元々原因があるのではなくて その if文 の実行のさせ方に元々の原因があるのでしょう。 おそらく onClipEvent (enterFrame) {} の{}内や onEnterFrame = function() {}; の{}内, または onClipEvent (mouseMove) {} の{}内や onMouseMove = function () {}; の{}内などで if文を実行させているから 「ずっと point が +1 される」のではないでしょうか? あと, 「どうなったときに point が +1 され, どうなったときに point が +1 されなくして, さらにどうなったときに 再びpoint が +1 されるように戻したいのか。」 この辺もハッキリさせる必要があります。 つまり, ムービークリップA と B が接触した瞬間にだけ point を +1 して その後は一切 point を +1 する必要はないのでしょうか? それとも またいつかは point を +1 させるような必要が出てくるのでしょうか? ということです。 結局, 「今はどうしているのか」 そして 「だからどうしたいのか」 が良くわからないということですね。 これらのことがわからなくても漠然とした回答ならできます。 しかし具体的な回答はできないので 私が勝手に作った1つの対策入りの状況例を書きます。   _root のフレーム1のステージ上には インスタンス名「a」というムービークリップと インスタンス名「b」というムービークリップがあるとします。 ※【図】↓ その場合の, 「a」や「b」が存在するタイムライン(_rootなど)のフレーム(フレーム1など)に書くスクリプト例です。 //------------------------------ //変数 point の値の初期化 var point:Number = 0; //フラグとなる変数「flg」を用意 var flg:Boolean = false; //「b」をプレスしたときに実行する関数を定義 b.onPress = function():Void { //「b」のドラッグを開始 this.startDrag(); // //マウスが動いたときに実行する関数を定義 this.onMouseMove = function():Void { //もし「b」が「a」と接触した上で if (this.hitTest(_root.a)) { //もし「flg」が false であれば if (!flg) { //「point」の値を 1 加算 _root.point += 1; //試しに 「point」の値を出力 trace(_root.point); //「flg」をtrueにする flg = true; } //「b」が「a」と接触していなければ } else { //「flg」をfalseにする flg = false; } }; }; //「b」を放したときに実行する関数を定義 b.onRelease = b.onReleaseOutside=function ():Void { //「b」のドラッグを終了 this.stopDrag(); // //マウスが動いたときに実行する関数を削除 delete this.onMouseMove; }; //------------------------------ ※ActionScript 2.0   Flash MX 2004 以降で使用可   Flash Player 6 以上で動作可 スクリプトが書けましたら 「制御」→「ムービープレビュー」で 「b」をドラッグして動作検証してみてください。 勝手に作った状況での具体的な回答ではなく 漠然とした回答を書くとするなら 「フラグを用意してそのフラグを切り替えて 動作の分岐をすれば良いのではないでしょうか。」 ということです。 またはフラグなど用意せずに バッサリと delete ○○.onMouseMove; や delete ○○.onEnterFrame; などをしてしまっても良いかもしれません。 その辺は 「今はどうしているのか」 そして 「だからどうしたいのか」 によって変わります。

関連するQ&A

  • ドラッグしたときの当たり判定

    ParaFlaを使ってFlashを制作しています aというスプライトをドラッグし bというスプライトにぶつかったらラベルCに飛ぶ というものを作りたいのですがうまくいきません aに記述しているアクションスクリプト on (press) { this.startDrag (true); } - on (release,releaseOutside) { this.stopDrag (); } - onClipEvent (enterFrame) { if(this.hitTest(_root.b) == true) { this.gotoAndPlay("c"); } } - onClipEvent (mouseMove) { updateAfterEvent(mouse); } バージョンはSWF8です ドラッグはできるのですがbとぶつかっても 何も起こりません bには何も記述していません どこを変更すればよいかわかる方 よろしくお願いします

    • ベストアンサー
    • Flash
  • 衝突判定について

    お世話になります。 現在、ある領域内で、球体を動かす処理をしています。 球体は複数ありそれぞれB1・B2・B3としています。 領域の境界を上がL1下がL2右がL3左がL4という具合に それぞれムービークリップを配置してます。 そこで問題なのですが、球体同士がぶつかったら、お互い 別方向に弾けるという処理をしているのですが、3回に一回 位の割合で、別方向に弾けないことがあります。 例えばB1とB2がぶつかった場合、B1は弾けるがB2は変化無く 動いてしまいます。何か良い方法は無いでしょうか? 下記にコードを記載します。よろしくお願いいたします。 onClipEvent(load) //初期値 { vx = 5; vy = 5; a = 1; b = 1; } onClipEvent(enterFrame){ //境界に達した時の処理 for (i=1;i<=4;i++){ kyokai = this.hitTest(_root[ "L" + i ]); if (kyokai==true && i == 1) {vy = 5; b = 1;} if (kyokai==true && i == 2) {vy = -5; b = -1;} if (kyokai==true && i == 3) {vx = -5; a = -1; } if (kyokai==true && i == 4) {vx = 5; a = 1; } } this._x += vx; this._y += vy; //他の球体を監視し、自分の領域に来たら //進行方向を逆にする for (i=1;i<=3;i++){ if(i!=1){ hantei = this.hitTest(_root[ "B" + i ]);} if (hantei==true){ if(a==-1) {vx=5; this._x = this._x+20;} if (b==-1) {vy=5; this._y = this._y+20;} if(a==1) {vx=-5; this._x = this._x-20;} if (b==1) vy=-5; this._y = this._y-20;} } }

  • シューティングゲームの自機の当り判定

    以前の質問で、アクションスクリプトの記述がなかったので、詳しく説明します。http://oshiete1.goo.ne.jp/qa3535566.html 自機は、キーボードで操作します。 if(Key.isDown(87)){ gotoAndPlay(3) } if(Key.isDown(83)){ gotoAndPlay(5) } 3は上向きグラフィック、5は下向きグラフィックです。 246フレームには、 gotoandplay(1) と記述しています。 当たり判定は、別レイヤーにあります。 ステージ上の自機にmyshipというインスタンス名を付けています。 敵弾に当たると自機はbangjikiになります。 if(this.hitTest(_root.myship.hitarea)){ _root.myship.gotoAndPlay("bangjiki") _parent.removeMovieClip() }

  • 良いソースの書き方について(複数のインスタンスをまとめてヒットテストする方法)

    ■例文: ---------------------------------------------------------------- onClipEvent (enterFrame) { if ( this.hitTest(_root.char1)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char2)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char3)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char4)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char5)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char6)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char7)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char8)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char9)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char10)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char11)) { _parent.nextFrame(); } } ---------------------------------------------------------------- 上記は、_root.char1 から_root.char11までインタンス名をつけたムービークリップとのヒット確認をするアクションスクリプトです。 こういう動作をしたい場合。 for文を駆使する等で、ソースを短くまとめる方法はありませんでしょうか。 いい案がありましたら、是非ご教授の程宜しくお願い致します。

    • ベストアンサー
    • Flash
  • 右回り、左回りの判定

    ムービークリップをドラッグし、右回転させている間はAの処理、左回転させている間はBの処理という判定の仕方がわからなくて困っています。 イメージとしてはターンテーブルのようなものです。 現在はムービークリップをドラッグし、右・左回転させるところまでは出来ています。 何かヒント・考え方で結構ですので、ご教授頂けないでしょうか。 下記に現在記述しているスクリプトを記載します。 root階層にインスタンス名"handle"というムービークリップを配置し、Iフレーム目に下記のスクリプトを記述。 handle.onPress = function():Void { if (this.hitTest(_root._xmouse, _root._ymouse, true)) { this.flag = true; } }; handle.onMouseMove = function():Void { if (this.flag == true) { xp = _root._xmouse-this._x; yp = _root._ymouse-this._y; rad = Math.atan2(yp, xp); degree = rad*(180/Math.PI); this._rotation = degree; } }; handle.onMouseUp = function():Void { this.flag = false; }; 宜しくお願いします。

    • ベストアンサー
    • Flash
  • 入れ子になっているMCのクリック判定について

    Flash ver9 AS2.0 使用です。 親MCの中に子MCがいる構造です。 親MCはロールオーバーで移動、ロールアウトで元の位置へ戻るボタンアクション(onRollOver、onRollOut)を付けています。 その中にいる子MCにもロールオーバーで拡大するというアクションを付けていますが、 こちらにはonClipEventで接触判定(hitTestメソッド)で拡大するかどうかを判断しています。 分からないのは、この子MCをクリックした時に他のシーンへ移動させたいのですが、苦し紛れで onClipEvent (enterFrame) { if (this.hitTest(_root._xmouse, _root._ymouse, true)) { //拡大処理 } onClipEvent(mouseDown){ //シーン移動処理 } としても、シーン移動が出来ませんでした。(当たり前ですよね…) hitTestメソッドのクリック判定バージョンがあれば良いのですが、 検索不足か本当に無いのか見つけられませんでした。 分かり難い説明かとは思いますが、シーン移動のさせ方、またはクリック判定の仕方を教えていただきたいです。

    • ベストアンサー
    • Flash
  • 当たり判定で一度だけ音をならすには

    当たり判定で、下記の様に書きました。 I_blueは青ボールインスタンス名、I_green 緑ボール インスタンス名です。 緑ボールをドラッグ&ドロップで青ボールに重ねると音がでるというものを作ろうとしています。 // Hsound01 = new Sound(_root.I_blue); Hsound01.attachSound("HS_sound01"); // _root.I_blue.onEnterFrame = function() { if (this.hitTest(_root.I_green)) { _root.Hsound01.start(0, 1); } }; // I_green.onPress = function(){ startDrag(this,false); } I_green.onRelease = function(){ stopDrag(); } ですが、これだと音が繰り返し再生されてしまいます。 当たり判定で一度だけ音をならすには、どのようにすべきでしょうか。 お知恵をお貸しいただけたらと思います。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • flash as2.0 hitTest()について

    FLASHMXで作業をしています。 mcが壁に当たると反対方向にmcを移動させたいのですが 以下では、うまくいきません。理由がわかりませんし打開策も わかりません。解決策を教えてください。よろしくお願いいたします。 onClipEvent(load){ this._x=100; this._y=380; } onClipEvent(enterFrame){ this._y -=3; if(_root.tama_mc.hitTest(_root.kabe_mc)==true){ this._y +=5; } }

  • インスタンス名の変更mcどうしのhittest

    お世話になります。Flash,actionscriptの初心者です。 現在actionscript2.0でちょっとしたFlashコンテンツを作っているのですが、解決できない ことがあり、ぜひお知恵を拝借できればと思います。 詳しくは添付図をご覧いただきたいのですが、 A1_mcとB1_mcのムービークリップをhittestで衝突判定させ、 B1_mcは見えないようにし、 A1_mcはgotoAndPlay(2)で2フレーム目にします(☆の絵)。 同時にthis._name="C1_mc"でインスタンス名を変更しました。 (ここまでは大丈夫で、trace(this._name)でも変更が確認できる。) 同じようにA2、B2、C2も設定しました。 そして、姿(○⇒☆)とインスタンス名(A⇒C)と変わった C1_mcとC2_mcをhittestで衝突判定させてD_mc(■)を見えるようにしたいのですが、 何も起きず、hittestが発動していないのではと思ってしまいます。 説明がわかりにくいと思うのですが、インスタンス名を変更した物どうしのhittestを うまく発動させるにはどうしたらよいか、教えていただきたいのです。 にわか知識のためFlashやactionscriptの根本的な問題を理解できてなさそうです・・・。 ちなみに何がやりたいかというと、○と○、○と☆ではお互いに反応しないが、 ○と◇が合体して☆になったもの同士(☆と☆)が接触すると、反応して■が出現する・・・ そんなFlashを作りたいのです。 自分の現状のやり方以外でこれが実現できるのなら、それでも大歓迎です。 長文になりましたが、ぜひともよろしくお願いいたします。 <参考・・自分の組んだAS> A1_mc.onEnterFrame = function() { if (this.hitTest(_root.B1_mc))     { _root.B1_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2);  //○⇒☆(2フレーム目)に姿を変える this._name="C1_mc"; //インスタンス名をA1_mcからC1_mcに変える     trace(this._name); //インスタンス名の変更を確認する。 delete this.onEnterFrame;     } else{ } }; A2_mc.onEnterFrame = function() { if (this.hitTest(_root.B2_mc))     { _root.B2_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2);  //○⇒☆(2フレーム目)に姿を変える this._name="C2_mc"; //インスタンス名をA2_mcからC2_mcに変える     trace(this._name); //インスタンス名の変更を確認する。 delete this.onEnterFrame;     } else{ } }; C1_mc.onEnterFrame = function() { if (this.hitTest(_root.C2_mc))     {     this.visible = false ; //姿を消す _root.C1_mc.visible = false; _root.D_mc.gotoAndPlay(2); //D_mcの出現(D_mcの1フレーム目は透明で見えなくしている。2フレーム目からアニメーションさせたいのでvisibleは使わない)     delete this.onEnterFrame; }   else{ } };

    • ベストアンサー
    • Flash
  • for文での配列の書き方で質問です

    CS3でゲームを作っています。 レモンが31個あり落ちてくるのをうけとります。 この受け取るときのfor文に以下のように書きました。 lemon_s.lemon0.hana.kajituの0~30までを参照したいのですが 配列のところがわかりません。 _root["lemon_s.lemon"] + i+["hana.kajitu"] というのがたぶん違っていてうまくいかないのだと思いますが 正しい書き方を教えてください。 onClipEvent (enterFrame) { for (i = 0; i < 30; i++) { if (this.in_ok.hitTest (_root["lemon_s.lemon"] + i+["hana.kajitu"])) { _root.point++; trace (_root.point); _root["lemon_s.lemon"] + i+["hana"].gotoAndStop (3); } } }