在数组中生成可供选择的随机对象

时间:2014-01-12 12:53:16

标签: actionscript-3 flash

我正在尝试制作像Tap Tap这样的游戏,除了坠落的物体是随机的。我现在遇到的问题是如果随机对象再次被选中(在它完成移动之前),它的位置将被重置。(这也意味着两个相同的对象不会出现在我不想要的屏幕上我想出一个解决这个问题的方法是我应该能够创建一个拾取的movieclip的副本,但我迷路了。救命?

另外,我是flash的新手。如果您有任何建议/意见,请告诉我! 谢谢你,祝你有个美好的一天。

var notes:Array = new Array(NGood1,NGood2,NGood3,NGood4,NGood5,NBad1,NBad2,NBad3,NBad4,NBad5);

var pos1:int;
var pos2:int;
var pos3:int;

pos1 = (stage.stageWidth / 3) -100;
pos2 = (stage.stageWidth / 2) -100;
pos3 = ((stage.stageWidth/3) *2) -100;

var timerN:Timer = new Timer(1000,120);
timerN.addEventListener(TimerEvent.TIMER, timerhandler);
timerN.start();

var secondsN:Number = 1;

function timerhandler(event:TimerEvent)
{
    //trace("Seconds elapsed: " + seconds);
    SpawnNote(null);
    secondsN++;

}


function SpawnNote(event:Event):void
{
    var spawn:int;
    var rpos:int;
    spawn = int(Math.random() * notes.length);
    rpos = int(Math.random() * 3) + 1;
    var note:MovieClip = new MovieClip();
    note = notes[spawn];
    addChild(note);
    if (rpos ==1)
    {
        note.x = pos1;

    }
    else if (rpos==2)
    {
        note.x = pos2;

    }
    else if (rpos==3)
    {
        note.x = pos3;

    }
    note.y = -20;
    note.addEventListener( Event.ENTER_FRAME, MoveNote );
    function MoveNote(event:Event):void
    {
        note.y +=  5;
        if (note.y >= stage.stageHeight - 50)
        {
            note.addEventListener( Event.ENTER_FRAME, StopNote );
            function StopNote(event:Event):void
            {
                note.removeEventListener( Event.ENTER_FRAME, MoveNote );
                //do more
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

如果你知道它的类名(Flash CSx中的符号名称),你可以创建一个"选中的movieclip"的副本。假设您已经绘制了一个好的注释,并在库中将其命名为NGood1。然后你需要制作那个符号的副本,你做var note:MovieClip = new NGood1();你可以在你的数组中创建一组注释作为,即所有命名notes数组中的注释不是时间轴上的对象,而是类名称或符号名称(这些在Actionscript 3中是相同的),并且要复制选定的notes[spawn]符号, do var note:MovieClip = new notes[spawn]();注意括号,这些使Flash调用构造函数来创建一个全新的对象。

您还没有做的另一件事是正确清理。请参阅,您将MoveNote函数指定给每个音符作为事件侦听器,并删除该侦听器,并在相同上指定另一个事件侦听器事件(Event.ENTER_FRAME) - 您不应该这样做,而是在需要注释停止移动时拨打removeEventListener(Event.ENTER_FRAME, MoveNote);

还有另外一件事:一旦你在听众中,你需要依靠event.target找出现在正在处理事件的对象,并且你经常使用{{1}变量。想象一下,你已经为舞台添加了两个音符,现在你需要每帧向下移动两个音符。你有两个音符,但只有一个存储在你的note变量中,因此,两个听众(你已经为每个音符分配了一个,这使得两个音符有效)将移动一个音符,而不是每个音符移动自己的音符。值得庆幸的是,您有办法访问从特定侦听器中侦听的对象,即您获取传递的事件并获取其note属性。然后你移动那个目标(必要时首先将其强制转换),这将使每个音符以自己的速度向下移动。

target