在动作脚本3中使用命中测试弹跳球

时间:2009-04-16 16:42:26

标签: actionscript-3 bounce hittest

我有这个让球反弹的代码,但是我要找的是从地面射出子弹,一旦他们击球,就应该向上弹回。目标不是让球击中地面。我确信之前已经完成了,但我觉得我太愚蠢了。

守则:

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

}

2 个答案:

答案 0 :(得分: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 :)
                }
            }
        }
    }
}

答案 1 :(得分:0)

有一个预先形成hittest的功能,你可以在这里阅读: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObject.html#hitTestObject()

如果你知道半径,如果中心之间的距离小于它们的半径之和,那么用圆圈就很容易了。他们互相接触。

但是通过查看你的代码,你应该正确地重写整个事情。球真的不应该在内部处理碰撞和运动逻辑。它应该只有一个位置和速度向量,运动和分离逻辑应该在其他类中。

至于反应代码,取决于你想要的复杂程度。可以简单地将速度向量的y部分翻转到相当复杂的数学中。

在这个领域有很多有关的东西和例子,我认为你最好在谷歌上找一些并玩它。然后自己写。