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

有一个用于执行 hittest 的功能,您可以在此处阅读:http: //livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObject.html#hitTestObject()

虽然对于圆来说,如果你知道半径就很容易了,如果中心之间的距离小于它们的半径之和;他们互相接触。

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

至于反应的代码,这取决于你想要它有多复杂。可以是简单地翻转速度向量的 y 部分,也可以是相当复杂的数学。

这方面有很多教程和示例,我认为您最好在谷歌上找到一些并使用它。然后自己写。

于 2009-04-16T20:02:20.547 回答