Использование прыгающего шарика в тестовом сценарии 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);
    }
}

}

2 ответа

Простой способ - использовать hitTestObject для DisplayObject. Это проверяет на совпадение. Конечно, вы можете написать что-то более продвинутое самостоятельно.

Для каждого обновления игры вы проверяете, попали ли пули в мяч, и принимайте меры, если они это сделали. Вам также следует рассмотреть возможность разделения игровой логики и обновления дисплея. Посмотрите на использование таймера.

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

Есть функция для предварительного тестирования, которую вы можете прочитать здесь: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObject.html

Хотя с кругами это довольно легко, если вы знаете радиус, если расстояние между центрами меньше, чем сумма их радиусов; они касаются друг друга.

Но, глядя на ваш код, вы должны правильно переписать все это. Мяч действительно не должен обрабатывать внутреннюю логику столкновения и движения. Он должен иметь только вектор положения и скорости, а логика движения и коллизии должна быть в других классах.

Что касается кода для реакции, это зависит от того, насколько сложным вы хотите его. И это может быть просто от переворота части вектора скорости до довольно сложной математики.

В этой области много примеров и примеров. Думаю, вам лучше найти их в Google и поиграть с ними. Тогда напишите свое.

Другие вопросы по тегам