0

在这个项目中,我想要一种颜色,我选择由一个框跟踪。我的代码的问题是即使舞台上有两种相同的颜色,它也只会跟踪其中一种颜色。如果你能帮助我,非常感谢。

主文件

package {

import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;

[SWF(frameRate='31', width='1000', height='500')]

    public class Main extends Sprite
    {
        private var balls:Array;
        private var directions:Array = [new Point(-1,-1),new Point(0,-1),new Point(1,-1),
                                        new Point(-1,0),new Point(1,0),
                                        new Point(-1,1),new Point(0,1),new Point(1,1)
                                        ];

        private var ballNum: Number = 10;
        private var ball:Ball;
        private var box:Box;

        /*private var padding:Number = 20;

        private var ay:Number = 5;
        private var gravity:Number = 6;
        private var bounce:Number = -0.9;
        */

        public function Main()
        {
            init();
        }
        private function init():void
        {
            balls = new Array();

            for(var i:Number = 0; i < ballNum; i++)
            {
                ball = new Ball(Math.random() * 30);

                ball.x = Math.random() * stage.stageWidth;
                ball.y = Math.random() * stage.stageHeight;
                ball.direction = directions[Math.floor(Math.random()*directions.length)];
                addChild(ball);

                balls.push(ball);
            }

            box = new Box();
            addChild(box);

            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(event:Event):void
        {
            for(var i:int = 0; i < balls.length; i++)
            {
                balls[i].x += balls[i].direction.x;
                balls[i].y += balls[i].direction.y;

                if (balls[i].colors == 0x79DCF4) {
                    box.x = balls[i].x - box.width / 2;
                    box.y = balls[i].y - box.height / 2;
                }
            }
        }
    }
}

球体

package{

    import flash.display.Sprite;
    import flash.geom.Point;

    public class Ball extends Sprite
    {
        public var colors:Array = [0xFFFF33, 0xa5a5a5, 0x79DCF4, 0xFF3333, 0xFFCC33, 0x99CC33];
        public var color:uint;
        public var radius:Number;
        public var direction:Point;

        public function Ball(radius:Number = 15, color:uint = 0xcccccc)
        {
            this.color = colors[randomColor(0, colors.length - 1)];
            this.radius = radius;

            init();
        }
        private function randomColor(min:Number, max:Number):Number
        {
            var randomNumber:Number = Math.round(Math.random() * (max - min) + min);
            return randomNumber;
        }

        private function init():void
        {
            graphics.beginFill(color);
            graphics.drawCircle(0,0,radius);
            graphics.endFill();
        }
    }
}
4

1 回答 1

2

我认为您想跟踪颜色,而不是颜色

所以改变这一行

if (balls[i].colors == 0x79DCF4) {

if (balls[i].color == 0x79DCF4) {

尝试在每一帧中跟踪一个球

    private var blueBalls:Array = [];//to save the blue balls

    private function init():void
    {
        balls = new Array();

        for(var i:Number = 0; i < ballNum; i++)
        {
            ball = new Ball(Math.random() * 30);

            ball.x = Math.random() * stage.stageWidth;
            ball.y = Math.random() * stage.stageHeight;
            ball.direction = directions[Math.floor(Math.random()*directions.length)];
            addChild(ball);

            balls.push(ball);

            if (ball.color == 0x79DCF4) {
                blueBalls.push(ball);
            }
        }

        box = new Box();
        addChild(box);

        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    private var lastBlueBallIndex:int = -1;//save which blue ball has been tracked in blueballs

    private var hasFind:Boolean = false;

    private function onEnterFrame(event:Event):void
    {
        hasFind = false;

        for(var i:int = 0; i < balls.length; i++)
        {
            balls[i].x += balls[i].direction.x;
            balls[i].y += balls[i].direction.y;

            var index:int = blueBalls.indexOf(balls[i]);

            if (index != -1 && !hasFind ) {

                //here is the main part, when reach last blue ball, reset lastBlueBallIndex 
                if (index == blueBalls.length - 1) {//if get last blue ball
                    lastBlueBallIndex = -1;
                } else if (lastBlueBallIndex  >= index) {//if the ball has been tracked
                    continue;
                } else {
                    lastBlueBallIndex = index;//set the current ball index
                }

                hasFind  = true;

                box.x = balls[i].x - box.width / 2;
                box.y = balls[i].y - box.height / 2;
            }
        }
    }

编辑

使用计时器而不是 ENTER_FRAME ,记得删除 Event.ENTER_FRAME 侦听器。

private function init():void {

    /*the old code*/


    var timer:Timer = new Timer(1000);//set the interval time longger if you want
    // you can change onEnterFrame to another name, like onTimer
    timer.addEventListener(TimerEvent.TIMER, onEnterFrame);
    timer.start();

}
于 2013-09-03T16:30:09.567 回答