0

私はボールをバウンドさせるこのコードを持っていますが、私が探しているのは、地面から弾丸を発射し、ボールに当たると上方に跳ね返るはずです。目標は、ボールが地面に当たらないようにすることです。これは以前に行われたと確信していますが、愚かすぎて理解できないと思います。

コード:

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

}

4

2 に答える 2

1

簡単な方法は、DisplayObject の hitTestObject を使用することです。これにより、オーバーラップがチェックされます。もちろん、もっと高度なものを自分で書くこともできます。

ゲームの更新ごとに、弾丸がボールに当たったかどうかを確認し、当たった場合はアクションを実行します。また、ゲーム ロジックとディスプレイの更新を分離することも検討する必要があります。タイマーの使用を検討してください。

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 :)
                }
            }
        }
    }
}
于 2009-04-16T20:05:43.643 に答える
0

ここで読むことができるヒットテストを実行するための関数があります: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObject.html#hitTestObject()

円の場合、中心間の距離が半径の合計よりも小さい場合、半径がわかっている場合は非常に簡単です。彼らはお互いに触れます。

しかし、コードを見て、全体を適切に書き直す必要があります。ボールは衝突と移動のロジックを内部で処理するべきではありません。位置と速度のベクトルのみを持つ必要があり、移動と衝突のロジックは他のクラスにある必要があります。

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

この分野には多くのチュートリアルと例があります。Google でいくつかを見つけて、それで遊んだほうがよいと思います。次に、自分で書きます。

于 2009-04-16T20:02:20.547 に答える