Одушевленные спрайты к точке - PullRequest
0 голосов
/ 06 ноября 2010

Я пытаюсь сделать что-то очень простое: анимировать группу спрайтов так, чтобы, независимо от того, где они находятся на сцене, все они шли к одной точке (в данном случае, к центру сцены). 1001 *

Это работает только для некоторых из них. Некоторые из них просто сидят там. Я не могу понять, почему. Я думаю, что это как-то связано с atan2 и тем, как я его использую, но я не уверен, что. Кто-нибудь может увидеть?

Спасибо

David

package
{

import Ball;

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;

public class MoveBalls extends Sprite {

    private var balls:Array = new Array();
    private var speed:Number = new Number(10);

    public function MoveBalls() {
        init();
    }

    private function init():void {
        stage.align = StageAlign.TOP_LEFT;
        stage.scaleMode = StageScaleMode.NO_SCALE;

        for(var i:int = 0; i<30; i++)
        {
            var ball:Ball = new Ball(20);
            ball.x = getRandomNumber();
            if(ball.x > stage.stageWidth) ball.x = stage.stageWidth -10;
            if(ball.x < 0) ball.x = 10;
            trace(ball.x);
            ball.y = getRandomNumber();
            if(ball.y >stage.stageHeight) ball.y = stage.stageHeight - 10;
            if(ball.y < 0) ball.y = 10;
            addChild(ball);
            balls.push(ball);
        }

        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    private function getRandomNumber():Number {
        var decider:Number = Math.random();
        if (decider < 0.5) {
            return Math.random()*1000;
        } else {
            return Math.random()*-1000;
        }
    }

    public function onEnterFrame(event:Event):void {

        var targetX:Number = stage.stageWidth/2;
        var targetY:Number = stage.stageHeight/2;
        for(var i:int=0; i < balls.length; i++)
        {
            var startX:Number = balls[i].x;
            var startY:Number = balls[i].y;
            var atanX:Number = (targetX - startX);
            var atanY:Number = (targetY - startY);
            if(atanX > .1)   //just stop when it's close enough to the center
            {
                var ang:Number  = Math.atan2(atanY, atanX);
                var xSpeed:Number = Math.cos(ang)*speed;
                var ySpeed:Number = Math.sin(ang)*speed;
                balls[i].x += xSpeed;
                balls[i].y += ySpeed;
            }
        }

    }
}
}

//ball class
package {
import flash.display.Sprite;

public class Ball extends Sprite {
    private var radius:Number;
    private var color:uint;

    public function Ball(radius:Number=40, color:uint=0xff0000) {
        this.radius = radius;
        this.color = color;
        init();
    }
    public function init():void {
        graphics.beginFill(color);
        graphics.drawCircle(0, 0, radius);
        graphics.endFill();
    }
}
} 

1 Ответ

0 голосов
/ 06 ноября 2010

Я не согласен с этой строкой:

if(atanX > .1)

Потому что, если шары должны идти в ЦЕНТР сцены, как на осях X и Y, то это условие не выполняется непосредственно для шаровпод или над центром.

Сделайте так:

 if (atanX > .1 || atanY > .1)

= Если любое из различий больше, чем .1, продолжайте с atan2 ...

РЕДАКТИРОВАТЬ: Еще одна очевидная ошибка - переменные atanX или atanY могут, на 50%, быть отрицательными.Поэтому, используйте либо это:

if (Math.abs(atanX) > .1 || Math.abs(atanY) > .1)

Или это, то же самое, но быстрее (хотя труднее читать):

if ((atanX > 0 ? atanX : -atanX) > .1 || (atanY > 0 ? atanY : -atanY) > .1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...