2009-04-16 5 views
0

ボールをバウンスさせるこのコードを持っていますが、私が探しているのは地面から弾丸を撃つことです。ボールを打つと、バウンスを上に戻します。目標は、ボールが地面に当たることではありません。私はこれが前に行われたと確信していますが、私はそれを理解するにはあまりにも馬鹿だと思います。ヒットテストバウンスボールをアクションスクリプトで使用する3

コード:

package { 

public class ball extends MovieClip { 

    var timer:Number=0; 
    var initialPos:Number=0; 
    var finalPos:Number=0; 
    var currentPos:Number=0; 
    var initialSpeed:Number=0; 




    function ball() { 

     startFallingBall(); 
    } 

    function moveBallDown(e:Event) { 
     timer+=1; 

     this.y = initialPos + .5 *(timer * timer); 
     checkBottomBoundary(); 
    } 

    function moveBallUp(e:Event) { 
     timer+=1; 

     var posA=this.y; 

     this.y = currentPos - initialSpeed*timer + .5*(timer * timer); 

     var posB=this.y; 

     checkTopBoundary(posA, posB); 
    } 

    function checkBottomBoundary() { 
     if (this.y+this.height>stage.stageHeight) { 
      finalPos=this.y; 

      stopFallingBall(); 
     } 
    } 

    function checkTopBoundary(firstPos:Number, secondPos:Number) { 
     if (secondPos>firstPos) { 
      stopRisingBall(); 
      startFallingBall(); 
     } 
    } 

    function startFallingBall() { 
     timer=0; 
     initialPos=this.y; 
     this.addEventListener(Event.ENTER_FRAME, moveBallDown); 
    } 

    function stopFallingBall() { 
     this.removeEventListener(Event.ENTER_FRAME, moveBallDown); 


     if (finalPos-initialPos<.1*this.height) { 
      stopRisingBall(); 
     } else { 
      startRisingBall(); 
     } 
    } 

    function startRisingBall() { 
     initialSpeed=Math.sqrt(Math.abs(finalPos-initialPos)); 
     timer=0; 

     currentPos=this.y; 

     this.addEventListener(Event.ENTER_FRAME, moveBallUp); 
    } 

    function stopRisingBall() { 
     this.removeEventListener(Event.ENTER_FRAME, moveBallUp); 
    } 

    function stopEverything() { 
     this.removeEventListener(Event.ENTER_FRAME, moveBallUp); 
     this.removeEventListener(Event.ENTER_FRAME, moveBallDown); 
    } 
} 

}あなたはここでそれについて読むことができますhittestを予備成形するための機能があります

答えて

0

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObject.html#hitTestObject()

あなたが半径を知っていれば円で、それは非常に簡単ですが、中心間の距離がそれらの半径の合計よりも小さい場合、彼らはお互いに触れる。

しかし、あなたのコードを見ることで、すべてを正しく書き直すべきです。ボールは実際に衝突や動きのロジックを内部的に処理すべきではありません。これにはポジションと速度ベクトルのみが必要で、移動とコリジョンのロジックは他のクラスにある必要があります。

反応のコードは、どのくらい複雑にしたいかによって異なります。そして、速度ベクトルのy部分を単純に反転させてから、かなり複雑な数学にすることができます。

この分野には多くの例がありますが、Googleでこれを見つけて遊ぶのが良いと思います。それからあなた自身で書く。

1

簡単な方法は、DisplayObjectのhitTestObjectを使用することです。これは、重複をチェックします。もちろん、あなた自身でより高度なものを書くことができます。

各ゲームのアップデートでは、弾丸がボールに当たっていないかどうかを確認し、そうした場合は対処します。また、ゲームのロジックを分離し、更新を表示することを検討する必要があります。 Timerを使って調べてみましょう。

package { 
    public class BallGame extends Sprite 
    { 
     private var ball:Ball; 
     private var bullets:Array; 

     public function BallGame() { 
      addEventListener(Event.ENTER_FRAME, checkCollision); 
      addEventListener(MouseEvent.CLICK, fireBullet); 
     } 

     private function fireBullet(e:MouseEvent):void { 
      // adds a fired bullet to an array so we can loop over all bullets 
      bullets.push(new Bullet()); 
     } 

     private function checkCollision(e:Event):void { 
      // loops through all bullets in play 
      for each(var bullet:Bullet in bullets) { 
       // check if the bullet is inside the ball 
       if (ball.hitTestObject(bullet)) { 
        // the bullet hit the ball 
        ball.startRisingBall(); 

        // TODO: remove the bullet :) 
       } 
      } 
     } 
    } 
} 
関連する問題