如何使用Action Script 3.0使随机放置的符号飞过?

时间:2010-03-17 12:49:54

标签: actionscript-3 flash-cs4

我正在尝试使用Flash CS4和Action Script 3.0制作一个简单的动画,以使一些符号从右到左不断飞行。我想要的是,一旦符号到达屏幕的末端,它就会被破坏而另一个符号被放置在起始位置。

我打算给每个符号一个随机的速度,并在每次“销毁”时创建一个随机符号。我能开始的任何线索吗?

4 个答案:

答案 0 :(得分:2)

由于你作为一个平台看起来很新,我认为在学习ActionScript时编写类不应该是你的第一个停靠点。绝对只是在时间轴上玩,并学习基础知识。作为一个非常简单的解决方案,我建议在库中创建一个类名为'MyBall'的MovieClip ...然后将其粘贴到主时间轴的第一帧上等。

    // Create some variables to store data
var numberOfBalls : int = 20;
var myBalls : Array = [];
var xVelocities : Array = [];

var maxXVelocitySpeed : Number = 5;
var minXVelocitySpeed : Number = 2;

// Add your orginal balls to the stage
for (var i : int = 0; i < numberOfBalls; i++)
{
    var myBall : MyBall = new MyBall();
    myBall.x = -(Math.random() * stage.stageWidth);
    myBall.y = Math.random() * stage.stageHeight;

    var xVelocity : Number = minXVelocitySpeed + (Math.random() * (maxXVelocitySpeed - minXVelocitySpeed));

    myBalls.push(myBall);
    xVelocities.push(xVelocity);

    addChild(myBall);
}

// Add a listener for enter frame events
addEventListener(Event.ENTER_FRAME, enterFrameHandler);


//Run this code on every frame to move the balls and reposition them if they are off the stage
function enterFrameHandler(event : Event) : void
{
    for each( var myBall : MyBall in myBalls)
    {
        var ballIndex : int = myBalls.indexOf(myBall);

        myBall.x += xVelocity[ballIndex];

        if (myBall.x > stage.stageWidth)
        {
            myBall.x = -(Math.random() * stage.stageWidth);
            myBall.y = Math.random() * stage.stageHeight;
        }
    }
}

答案 1 :(得分:1)

首先,将符号转换为MovieClip。然后为符号创建一个基类MySymbol.as,如:

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.geom.Point;


    public class MySymbol extends MovieClip
    {
        public var speed:Number;        // Pixels moved per frame


        public function MySymbol(speed:Number, startPosition:Point)
        {
            this.speed = speed;
            this.addEventListener(Event.ENTER_FRAME, update);

            this.x = startPosition.x;
            this.y = startPosition.y;
        }


        private function update():void
        {
            this.x -= this.speed;
            if (this.x < 0 - this.width) {      // We're at the left edge
                this.removeEventListener(Event.ENTER_FRAME, update);
                this.dispatchEvent(new Event(Event.COMPLETE));
            }
        }
    }
}

然后确保为AS3导出影片剪辑(库中项目的“链接”选项)。使每个项目的类名称唯一(例如MySymbol1,MySymbol2),并将基类设置为MySymbol。

您的文档类可能如下所示:

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import MySymbol;                // Not strictly needed

    public class DocumentClass extends flash.display.MovieClip
    {
        private static var SYMBOLS:Array = new Array(MySymbol1, MySymbol2);

        public function DocumentClass()
        {
            // Create five symbols:
            for (var i:int = 0; i < 5; i++) {
                makeSymbol();
            }
        }


        private function makeSymbol():void
        {
            // Pick a random symbol from the array:
            var symType:Class = SYMBOLS[Math.random() * SYMBOLS.length];

            // Construct the new symbol:
            var loc:Point = new Point(stage.stageWidth, Math.random() * stage.stageHeight);
            var sym:MySymbol = new symType(1 + Math.random() * 30, loc);

            // Listen for the object hitting the left edge:
            sym.addEventListener(Event.COMPLETE, remakeObject);
            this.addChild(sym);
        }


        private function remakeObject(e:Event):void
        {
            e.target.removeEventListener(Event.COMPLETE, remakeObject);
            this.removeChild(e.target);

            // Replace the dead symbol:
            makeSymbol();
        }
    }
}

如果不是破坏并重新创建一个飞离舞台的对象,而是重新使用现有的对象并将其移回右侧,那么效率要高得多。但如果事情变得缓慢,这是您稍后可以实施的优化。

请注意,上面的所有代码都是UNTESTED,我有一段时间没有编写AS3,因此可能至少有一些错误。希望它将成为一个很好的起点。

答案 2 :(得分:0)

这里有一些提示可以帮助您入门。

MovieClips拥有xy属性。如果您要随着时间的推移添加这些数字,您会看到MovieClip沿着stage的x和/或y轴移动。请使用Event.ENTER_FRAME进行此操作,这样您就可以在每次更新屏幕时更改值。

您的stage将具有给定的宽度(stageWidth属性)。您可能希望监视MovieClip的x属性何时大于舞台的宽度。如果它被移除(removeChild),则添加一个新的(addChild)并将其放回开始x/y位置。

答案 3 :(得分:0)

  • 定义一个Circle(符号)类,用于扩展Sprite / Shape并具有velocity变量
  • 用随机颜色绘制一个圆圈(或其他) Math.floor(Math.random() * 0xffffff)
  • 为速度分配随机值
    minVelocity + Math.floor(Math.random() * velocityRange)
  • start()类中创建一个注册输入框处理程序
  • Circle方法
  • 在输入框处理程序中增加this.y,并在'recycleMe'超过最大值时发送y事件。
  • 创建CircleaddChild个N个实例,并调用他们的start()方法。
  • 在每个节目上收听'recycleMe'个事件,并从处理程序重置y的值。