深度とhittestとは?

このQ&Aのポイント
  • 深度とhittestについて調べてみたが解決できず質問する。
  • 弾を撃って当たったら両方消える処理を実装するために深度を考慮する必要がある。
  • しかし、深度を考慮すると連射ができなくなってしまう問題が発生している。解決策を教えて欲しい。
回答を見る
  • ベストアンサー

深度とhittest

いろいろ調べて、本も買って読んでみたのですが、解決することができなかったので質問させてください。 3つのオブジェクトがあります(tamaとtekiとjiki) //メインのタイムライン上 onClipEvent(load){ a=1; count=1; } onClipEvent(enterFrame){ jiki.attachMovieClip("tama","tama"+a,a) if(KeyDOWN(SPACE){ jiki.attachMovieClip("tama","tama"+a,a) _root."tama"+a._x=jiki._x _root."tama"+a._y=jiki._y a++; } //弾のスクリプト if(this.hittest(teki)){ this.removeMovieClip(); teki.removeMovieClip(); } 弾を撃って弾が敵に当たったなら弾と敵を両方消すということをしたいです。 弾の深度を考えず、attachMovie("tama","tama",1)としたときはきちんと消すことが出来ました。しかしそれだと弾を連射することができません。なので深度を使ってattachMovie("tama","tama"+a,a)としたとき、連射はできるようになったのですが、今度は敵にあたらなくなってしまいました。どうすれば敵と深度aにある弾があたるようになるか教えていただけませんか?若しくはヒントだけでもいただけないでしょうか?? 宜しくお願いします。

  • Flash
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • sjt2007
  • ベストアンサー率25% (3/12)
回答No.2

一応確認ですが 以下の様にして動きませんか? 当方でFLASH 8(as 2),FLASH 6(as 1)で書き出した所、動く様ですが。 //jikiのMCの中に書くスクリプト onClipEvent (load) { a = 1; count = 1; } onClipEvent (enterFrame) { //jiki.attachMovie("tama", "tama"+a, a); if (Key.isDown(Key.SPACE)) { _root.attachMovie("tama", "tama"+a, a); _root["tama"+a]._x =this._x; _root["tama"+a]._y = this._y; a++; } } // //ライブラリ内のtamaのフレームに書くスクリプト this.onEnterFrame = function() { this._x+=10;//tamaの移動 if (this.hitTest(_root.teki)) { trace("hit") this.removeMovieClip(); _root.teki.removeMovieClip(); } }; 変数aについてですが、 jikiのMCにaと書くと jikiのa(_rootで表現すると_root.jiki.a)と認識され tekiのMCにaと書くと tekiのa(_rootで表現すると_root.teki.a)と認識され それぞれ別の変数として扱われます。 同じ変数として扱うのであれば_root.aとして下さい。 (jikiのaをそのままにし、tekiのaを_root.jiki.aとしても可。逆も可) ただし、_root.aとすると 最後のtamaのみしか、判定がされなくなります。 a=15の時、14以下は無視されます。 (tekiが一体であれば、上記のスクリプトの様に tamaの方で当たり判定を行えば問題ありません) 画面上にあるtamaを全てを判定するにはいくつか手段があります。 とりあえず今回は配列を使用して、tamaをリスト化して判定してみます。 // //jikiのMC内のスクリプト onClipEvent (load) { _root.a = 1; count = 1; //スクリーンにあるtamaのリストです。 _root.tama_list=new Array(); } onClipEvent (enterFrame) { //jiki.attachMovie("tama", "tama"+a, a); if (Key.isDown(Key.SPACE)) { _root.attachMovie("tama", "tama"+_root.a, _root.a); _root["tama"+_root.a]._x =this._x; _root["tama"+_root.a]._y = this._y; //tamaを配置したらリストに追加する _root.tama_list.push(_root["tama"+_root.a]); _root.a++; } } // //tekiのMC内のスクリプト onClipEvent (enterFrame) { //リストにあるtamaの数だけ判定する for (var i = 0; i<=_root.tama_list.length; i++) { if (this.hitTest(_root.tama_list[i])) { trace(_root.tama_list[i]); _root.tama_list[i].removeMovieClip(); //tamaを削除したらリストからも削除する。 //もしtamaの方で画面外など消す場合には同じスクリプトを挿入する _root.tama_list.splice(i,1); this.removeMovieClip(); } } }

pekotann11
質問者

お礼

動作確認までしてもらってありがとうございます。 無事動作しました。 本当にありがとうございます。

その他の回答 (1)

  • sjt2007
  • ベストアンサー率25% (3/12)
回答No.1

8行目、 jiki.attachMovieClip("tama","tama"+a,a) とありますが jikiのMCの中に弾を配置する事になっています。 jikiではなく、_rootに置けば期待通りになると思います。 _root.attachMovieClip("tama","tama"+a,a) もう一点、 tamaのスクリプトというのは tamaのMCのタイムラインに書いてあるのですか? そうであれば tekiというのはtamaのMC内にあるtekiを指してしまっています。 実際にはtekiは_rootにありますよね? 以下の様に書けばよろしいかと思います。 if(this.hittest(_root.teki)){ _root.teki.removeMovieClip(); this.removeMovieClip(); } this.removeMovieClip()を 先に実行してしまうと MCが消えてしまうので teki.removeMovieClip();が実行されません。 その為、順を変えました。

pekotann11
質問者

お礼

回答ありがとうございます。変更してみました。 が、上手く動きませんでした。 //メインのタイムラインにおいてある「jiki」の中にかいてあるスクリプト onClipEvent(load){ function shotting(){ a=1; if(Key.isDown(Shot_Key_code)){ _root.attachMovie("tama","tama"+a , a); _root["tama"+a]._x = this._x; _root["tama"+a]._y = this._y; trace("tama"+a); a++; } onClipEvent(enterFrame){ shotting(); } //敵の中に書いてあるスクリプト(ライブラリの中にあります) if (this.hitTest(_root["tama"+a])) { _root["tama"+a].removeMovieClip(); this.removeMovieClip(); trace("hit"); } です。敵の中のスクリプト _root["tama"+a]の部分でaの部分を10に変更して試してみたところ、10発目の玉はキチンと当たり判定が出ました。なので、このaの部分が問題なのだとは思うのですが、どのようにしたらいいのかわかりません。 もし、このようにしてみたらいかが?という意見がありましたら教えていただきたいです。宜しくお願いします。

関連するQ&A

  • 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; } }

  • ムービークリップを削除したい

    FLASH 5 を使っています。 現在、duplicateMovieClip を使ってムービークリップを複製できるようにしています。 複製するMCの名前に連番を付けるようにして同じものを何個も複製できるようにしています。 別途、ゴミ箱を作り複製したMCをゴミ箱に乗せると削除できるようにしたいと考えています。 hitTest と removeMovieClip を使えば良さそうなのですがうまくいきません。 複製したMCが何個も出来るためゴミ箱基準だとMCの名前を指定できないので複製元のMCに onClipEvent (enterFrame) { if (this.hitTest( _root.gomi )) { this.removeMovieClip (); } } と書いてみたのですがダメでした。 なにぶん Actionscriptを始めたばかりで、良く分かりません。 お分かりの方、教えていただけますでしょうか? 宜しくお願い致します。

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

    ■例文: ---------------------------------------------------------------- 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
  • FLASHでの深度の設定

    こんにちは、よろしくお願い致します。 使用OSはmacOS10.28 使用ソフトはFLASH MX 2004です。 アクションをフレームに書いて括弧内のURLの動きを作りました 白いバックに白い文字でリンクを置き、以下のスクリプトで反応すると白バックに隠していた白いリンクが見える。と、いったものを作ろうとしたのですが、うまくいきません・・・ リンクしたい物の深度を_root.link.swapDepths(5);としたりするとリンクしたい物が消えてしまいます。 駄文で失礼いたしますが、どなたかお詳しい方教えていただきませんか?お願いします。 this.makemc(); function makemc() { cnt = 20; w = Stage.width/(cnt+1); h = Stage.height/(cnt+1); for (i=1; i<=cnt; i++) { for (j=1; j<=cnt; j++) { x = i*w; y = j*h; ++depth; newname = "ball"+depth; props = {_x:x, _y:y, onMouseMove:effect}; this.attachMovie("ball", newname, depth, props); } } } function effect() { cMax = 150; a = this._x-_root._xmouse; b = this._y-_root._ymouse; c = Math.sqrt(a*a+b*b); if (c>cMax) { d = 0; } else { d = 1000*(1-c/cMax); } this._xscale = Math.max(1, d); this._yscale = Math.max(1, d); }

  • 下からスライドしてくるメッセージ

    こんにちは。 フラッシュ初心者です。画面下に、タブを出しておいてマウスオーバーすると上にスライドしてメッセージが出るというものを作っているんですが、位置の指定がうまくいきません。 もともと横にスライドするサンプルを見つけまして、縦に動くようにカスタマイズしているのですが…。 最初の位置の指定はできました。動きも縦になったのですが上に行き過ぎてしまうのです…。 メッセージ枠の幅だけ上に上がるようにするか、または上から○pxのところまで上がるように指定したいのですが、この場合どうすればよいのでしょうか? ↓今、こんな感じで作ってます。ステージはw400px×H200pxです。 onClipEvent (load) { this._y = 180; } onClipEvent (enterFrame) { if (this.hitTest(_root._xmouse,_root._ymouse,1)) { this._y -= (this._height-this._y)/_root.speed; } else { this._y += (180-this._y)/_root.speed; } }

    • ベストアンサー
    • Flash
  • インスタンス名の変更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
  • actionscript2.0でMCの切り替えなど

    Flash初心者で勉強中の身なのですがどうか質問させてください。 根本的に間違っていたりできないことをやろうとしていたら申し訳ないです。。 その際にはこう改変した方がいいとのご指示をご教示頂きたいです。よろしくお願いいたします。 attachMovieを使ってライブラリ内のMCをステージに呼び出し、そのMCを押す度にそのMCを切り替えたいと考えています。 ライブラリにはa1,a2,,,a5、b1,b2,,,,b5,c1,d1,e1…という識別子をつけたMCを用意しています。 a-eの横幅は80×80です。 20ずつ間を空けて○1のMCを横一列に配置しました。 _root.attachMovie("a1", "a1",1, {_x: 100, _y: 100}); _root.attachMovie("b1", "b1",1, {_x: 200, _y: 100}); _root.attachMovie("c1", "c1",1, {_x: 300, _y: 100}); _root.attachMovie("d1", "d1",1, {_x: 400, _y: 100}); _root.attachMovie("e1", "e1",1, {_x: 500, _y: 100}); このMCを押すと、MCが数字の大きいものに切り替わる(b1を押すとb2のMCに…で5まで)ようにしたいので、 ひとつひとつを下記のscriptで記述しました。 _root.attachMovie("b1", "b1",1, {_x: 200, _y: 100}); b1.onPress=function(){ b1.removeMovieClip(); _root.attachMovie("b2", "b2",1, {_x: 200, _y: 100}); b2.onPress=function(){ b2.removeMovieClip(); _root.attachMovie("b3", "b3",1, {_x: 200, _y: 100}); b3.onPress=function(){ b3.removeMovieClip(); _root.attachMovie("b4", "b4",1, {_x: 200, _y: 100}); b4.onPress=function(){ b4.removeMovieClip(); _root.attachMovie("b5", "b5",1, {_x: 200, _y: 100});}}}} これをa-e同じことを繰り返しています。 ここからが問題なのですが、 ここで例えば a2,b5,c1,d3,e1 という風に適当に押されてMCが切り替わり、整列させるボタンが押された時、 その数字を参照して 縦に20pxずつ空けながら b5 (空行/4があった場合の行) d3 a2 c1(20pxの空白)e1 と並べ替えたいと思っています。 つまり、a-eが現在どの数字(○1,○2..)なのかを調べ、その数字の若い方から順に縦に配置させたいと考えています。 また、上のc1,e1のように1の数字のMCが2つ以上あった場合は、同じ行に20pxずつ空けて横に配置していきたいのです。 その調べた数字の順に縦と横に並べ替える(新たにステージ上に配置し直す)というルール付けをどういうscriptを書けば上手く行くかが自分ではどうにも分からず、ここから進めない状態です。。 誰がどんな回数押したとしてもそれに準じた整列をして欲しいのですが、そのやり方があるようでしたらどうかご教示頂きたいです。 また、上記の私の書き方では難しいようでしたらそこから改変したものをお教え願いたいです。 分からないことばかりで申し訳ないのですが、何卒よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • actionscript1.0でJPGを読み込んでるところをSWFに、

    actionscript1.0でJPGを読み込んでるところをSWFに、、、 初心者のため良く分からないため質問いたします。 FLAを開くと設定はFlashのactionscript1.0 パブリッシュ設定がFlash Player8.0でした。 現在上記設定で下記scriptが書かれているものをFlashCS4で開いています。 そして現在3つのJPGを読み込んでいるのですが、そこをSWFに変更したいと考えています。 現在はAS1.0ですが、これを機会にAS3.0に変えたいとも考えています。 どう調べていいか分からないので質問させていただきました。 質問自体よく分からないかもしれませんが、非常に困っています。 よろしくお願いいたします。 onClipEvent (load) { Pass = "img_top_flash/"; Timer = _root.Sec*30; cnt = 0; this._y = 300; //元はthis._y = -20; this.loadVariables( Pass + "top_flash_url.txt"); function loadJPG() { _root.Loaded = false; cnt = 0; if (num == Max) { num = 0; } else if (num<0) { num = Max-1; } depth++; if (depth>1) { _root.mc["m"+(depth-2)].removeMovieClip(); } navi.slider._alpha = 100; mcName = "m"+depth; _root.mc.attachMovie("pic",mcName,depth); _root.mc[mcName].fileName = Pass+picArray[num]+".jpg"; for (i = 0; i < Max; i++) { if (i == num) { navi.mc["b"+i].gotoAndStop(2); } else { navi.mc["b"+i].gotoAndStop(1); } } } } onClipEvent (data) { picArray = files.split(","); Max = picArray.length; for (i = 0; i < Max; i++) { mcName = "b"+i; navi.mc.attachMovie("navi_btn",mcName,i); navi.mc[mcName].num = i; navi.mc[mcName]._x = i*20; } navi.mc.attachMovie("sankaku","sankaku",Max); navi.mc.sankaku._x = Max*20; num = depth = 0; loadJPG(); } onClipEvent (enterFrame) { if (Max>1 && _root.Loaded) { //this._y -= this._y/4; this._y -= this._y/100; if ( this._y <= 280 ) { this._y = 280; } navi.slider._x += (num*20-navi.slider._x)/_root.spd; navi.slider._alpha += (50-navi.slider._alpha)/_root.spd; cnt++; if (cnt>Timer) { num++; loadJPG(); } } }

    • ベストアンサー
    • Flash
  • hitTestのロールアウト判定

    auのスライド式メニューなんですが、あれってボタンの中にボタンが入っていますよね?過去記事を読んだところ、「ボタンが重なり合った領域でマウス操作すると手前のインスタンスしかイベントを受け取れない」ので「hitTestを使う」とありました。ただ、ちょっと問題が・・ --問題点--- _________________________ |      |mc|mc|mc|mc| |  余白  | | | | | |      | | | | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ こんな感じなんですが、swfに余白のある左側に出た場合はrollOut処理が働くのですが、余白のない「上、右、下」に出た場合に、処理が働かないんです。on()で記述した場合にはどの方向からでもrolloutするのに何故ダメなのでしょうか? --ActionScript--- onClipEvent (load) {  totalNum=4;leftX=20;rightX=320;mcPos=rightX;speed=5;  function mcSet(myNum){   var i=1;   while(i<=myNum){_parent["cont"+i+"_mc"].setMove("left");i++;}   while(i<=totalNum){_parent["cont"+i+"_mc"].setMove("right");i++;}  }  function setMove(dir) {   if(dir=="left"){mcPos=leftX;}else if(dir=="right"){mcPos=rightX;}   this.onEnterFrame=xMove;  }  function xMove(){   nextX=this._x+(mcPos-this._x)/speed;   if(Math.abs(mcPos-nextX)>0.1){this._x=nextX;   }else{this._x=mcPos;this.onEnterFrame=undefined;}  }  function init(){   var i=1;   while(i<=totalNum){    _parent["cont"+i+"_mc"].setMove("right");i++;   }  } } onClipEvent(enterFrame){  if(this.hitTest(_root._xmouse, _root._ymouse, true)){this.mcSet(1);}else{init();} }

    • ベストアンサー
    • Flash
  • MC間でMCをやり取りできますか?

    質問は初めてですがよろしくお願いします。 深度入れ替えの関係で(簡略化のため)、MCを似たような深度ずつに親MCにまとめる構造で作成してきました。 しかし、このやり方では、当初予定していた深度の移動はできますが、予定外の深度の移動が、不可能になりました。 やりたいこと _root.a.mc のような構造の中のmcというムービークリップを、 _root.b.mc の階層に移動したいのです。mcの持つ変数等も一緒に移動できるのが好ましいです。 不可能であれば、 attachMovie()、removeMovieClip()あたりを使って負荷のかかりそうなやり方で我慢しようとは思っています。 ParaFla!使用・SWF8:FLASH8相当の設定で製作中

    • ベストアンサー
    • Flash

専門家に質問してみよう