【问题标题】:How can I use Action Script 3.0 to make random placed Symbols fly by?如何使用 Action Script 3.0 让随机放置的符号飞过?
【发布时间】:2011-01-28 13:38:28
【问题描述】:

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

我打算给每个符号一个随机速度,并在每次“销毁”时创建一个随机符号。有什么线索可以开始吗?

【问题讨论】:

    标签: actionscript-3 flash-cs4


    【解决方案1】:

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

    MovieClips 有一个 xy 属性。如果您要随着时间的推移添加这些数字,您会看到MovieClip 沿着stage 的 x 和/或 y 轴移动。考虑使用Event.ENTER_FRAME 执行此操作,这将允许您在每次屏幕更新时更改值。

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

    【讨论】:

    • stage.width 不能用于获取舞台的宽度。它存在但不用于舞台对象。请改用stage.stageWidth
    • 我正在尝试将 Actionscript 应用于我的图形符号之一,但它告诉我“当前选择不能应用操作”。这是为什么呢?
    • @Cameron - 公平的呐喊。修改
    • @William Calleja - 您只能向 MovieClips 添加动作。尝试将其更改为 MovieClip 实例。话虽这么说,您最好将所有代码放在主时间线上,并通过它们的实例名称引用您的 MovieClip。我建议先做一些基本的动作脚本教程来弄清楚基础知识senocular.com/flash/tutorials/as3withflashcs3
    • 谢谢伙计!这正是我所需要的。
    【解决方案2】:
    • 定义一个 Circle(符号)类,它扩展 Sprite/Shape 并具有一个 velocity 变量
    • 用随机颜色画一个圆(或其他)
      Math.floor(Math.random() * 0xffffff)
    • 为速度分配一个随机值
      minVelocity + Math.floor(Math.random() * velocityRange)
    • 在注册进入帧处理程序的Circle 类中创建start() 方法
    • 在进入帧处理程序中增加this.y,如果y 大于最大值,则调度'recycleMe' 事件。
    • 创建CircleaddChild它们的N个实例,并调用它们的start()方法。
    • 监听每个事件上的'recycleMe' 事件,并从处理程序中重置y 的值。

    【讨论】:

      【解决方案3】:

      首先,将您的符号转换为影片剪辑。然后为您的符号创建一个基类 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();
              }
          }
      }
      

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

      请注意,上面的所有代码都未经测试,并且我有一段时间没有编写 AS3 代码,因此其中可能至少存在一些错误。希望它可以作为一个足够好的起点。

      【讨论】:

        【解决方案4】:

        由于您似乎对 Flash 作为一个平台很陌生,我认为编写类不应该是您学习 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;
                }
            }
        }
        

        【讨论】:

        • 是的,比我的例子更容易理解。我认为 OP 有其他语言课程的经验,但事实可能并非如此。
        • @Cameron - 很好。很高兴在页面上有两个不同的有效示例;)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 1970-01-01
        • 2015-10-24
        • 2012-06-13
        • 1970-01-01
        相关资源
        最近更新 更多