Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何使用动作脚本3.0使随机放置的符号飞过?_Actionscript 3_Flash Cs4 - Fatal编程技术网

Actionscript 3 如何使用动作脚本3.0使随机放置的符号飞过?

Actionscript 3 如何使用动作脚本3.0使随机放置的符号飞过?,actionscript-3,flash-cs4,Actionscript 3,Flash Cs4,我正试图用Flash CS4和动作脚本3.0制作一个简单的动画,让一些符号不断地从右向左飞过。我想要的是,一旦一个符号到达屏幕的末端,它就会被销毁,另一个符号会被放置在开始位置 我意愿给每个符号一个随机的速度,并在每次一个符号被“摧毁”时创建一个随机符号。有什么线索可以让我开始吗?这里有一些提示让你开始 MovieClips具有x和y属性。如果要随时间增加这些数字,您将看到MovieClip沿阶段的x轴和/或y轴移动。使用事件查看此操作。输入_FRAME,这将允许您在每次屏幕更新时更改值 您的s

我正试图用Flash CS4和动作脚本3.0制作一个简单的动画,让一些符号不断地从右向左飞过。我想要的是,一旦一个符号到达屏幕的末端,它就会被销毁,另一个符号会被放置在开始位置


我意愿给每个符号一个随机的速度,并在每次一个符号被“摧毁”时创建一个随机符号。有什么线索可以让我开始吗?

这里有一些提示让你开始

MovieClips
具有
x
y
属性。如果要随时间增加这些数字,您将看到
MovieClip
沿
阶段的x轴和/或y轴移动。使用
事件查看此操作。输入_FRAME
,这将允许您在每次屏幕更新时更改值

您的
stage
将具有给定的宽度(一个
stageWidth
属性)。当MovieClip的
x
属性大于舞台宽度时,您可能需要进行监视。如果是删除(
removeChild
),则删除并添加一个新的(
addChild
),并将其放回起始位置。

  • 定义一个
    (符号)类,该类扩展精灵/形状并具有
    速度
    变量
  • 用随机颜色画一个圆(或任何东西)
    Math.floor(Math.random()*0xffffff)
  • 为速度指定一个随机值
    minVelocity+Math.floor(Math.random()*velocityRange)
  • 在注册enter frame处理程序的
    Circle
    类内创建一个
    start()
    方法
  • 在输入帧处理程序中增加
    this.y
    ,如果
    y
    大于最大值,则调度
    'recycleMe'
    事件
  • 创建N个
    Circle
    addChild
    实例,并调用它们的
    start()
    方法
  • 侦听每个事件上的
    'recycleMe'
    事件,并从处理程序中重置
    y
    的值

首先,把你的符号变成电影唇。然后为符号创建一个基类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));
            }
        }
    }
}
包{
导入flash.display.MovieClip;
导入flash.events.Event;
导入flash.geom.Point;
公共类MySymbol扩展了MovieClip
{
公共变量速度:Number;//每帧移动的像素数
公共函数MySymbol(速度:数字,起始位置:点)
{
速度=速度;
this.addEventListener(Event.ENTER_FRAME,update);
此.x=起始位置.x;
此.y=起始位置.y;
}
私有函数更新():void
{
这个.x-=这个速度;
如果(this.x<0-this.width){//我们在左边
this.removeEventListener(Event.ENTER_FRAME,update);
this.dispatchEvent(新事件(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();
        }
    }
}
包{
导入flash.display.MovieClip;
导入flash.events.Event;
导入MySymbol;//严格来说不需要
公共类DocumentClass扩展了flash.display.MovieClip
{
私有静态变量符号:数组=新数组(MySymbol1,MySymbol2);
公共函数DocumentClass()
{
//创建五个符号:
对于(变量i:int=0;i<5;i++){
makeSymbol();
}
}
私有函数makeSymbol():void
{
//从阵列中拾取一个随机符号:
var symType:Class=SYMBOLS[Math.random()*SYMBOLS.length];
//构建新符号:
var loc:Point=新点(stage.stageWidth,Math.random()*stage.stageHeight);
var-sym:MySymbol=new-symType(1+Math.random()*30,loc);
//倾听物体撞击左边缘的声音:
sym.addEventListener(Event.COMPLETE,remakeObject);
这个.addChild(sym);
}
私有函数remakObject(e:事件):void
{
e、 target.removeEventListener(Event.COMPLETE,remakeObject);
这是removeChild(即target);
//替换死符号:
makeSymbol();
}
}
}
如果你不再破坏和重新创建一个飞离舞台的物体,而是重新使用现有的物体并将其移回右边,那么效率会更高。但这是一个优化,如果事情进展缓慢,您可以稍后实施


请注意,上面的所有代码都未经测试,我已经有一段时间没有编写AS3了,因此其中可能至少有一些bug。希望它能成为一个足够好的起点。

因为你似乎还不熟悉flash作为一个平台,我认为在学习ActionScript时,编写类不应该是你的第一个选择。当然,现在只需按照时间线进行游戏,并学习基础知识。作为一个非常简单的解决方案,我建议在库中创建一个MovieClip,类名为“MyBall”。。。然后将其粘贴到主时间线的第一帧上

    // 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;
        }
    }
}
//创建一些变量来存储数据
变量numberOfBalls:int=20;
var myBalls:Array=[];
var-xv:Array=[];
var maxXVelocitySpeed:数字=5;
var minXVelocitySpeed:Number=2;
//将你的原始球加入舞台
for(变量i:int=0;i