首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3洗牌运动

AS3洗牌运动
EN

Stack Overflow用户
提问于 2015-07-30 08:46:44
回答 2查看 292关注 0票数 0

我增加了基本的目标和应用拖放我的拼图,现在我有困难,使洗牌方面。在玩家完成或打开fla之后,每次都会在舞台的任意位置开始拼图。我理解如何使用数组进行洗牌,但我不确定如何做到这一点。我已经将我的19个拼图块的实例存储在数组中,但是现在我不知道如何处理这个数组。其他的教程都超出了我的范围,让我的头抓挠。

刚开始为flash专业人士编写代码,所以是的,任何帮助洗牌的电影剪辑(拼图片)将不胜感激。

这里是我的代码,我没有发布全部内容,因为从P1到P19基本上是复制粘贴:

代码语言:javascript
复制
import flash.events.Event;

stage.addEventListener(Event.ENTER_FRAME, EntFrame)
function EntFrame(e: Event) : void
{

    P1.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag);
    function fl_ClickToDrag(event:MouseEvent):void
    {
        P1.startDrag();
    }
    stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop);
    function fl_ReleaseToDrop(event:MouseEvent):void
    {
        P1.stopDrag();
    }
    if (T1.hitTestObject(P1.Tar1))
    {
        P1.x = 313.15;
        P1.y = 242.75;
    }

    P19.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag_19);
    function fl_ClickToDrag_19(event:MouseEvent):void
    {
        P19.startDrag();
    }
    stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_19);
    function fl_ReleaseToDrop_19(event:MouseEvent):void
    {
        P19.stopDrag();
    }
    if (T19.hitTestObject(P19.Tar19))
    {
        P19.x = 624.35;
        P19.y = 455.60;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-30 20:54:28

以下是我希望更全面的答案。

首先,丢弃那些内联函数。现在,您可以创建一个ENTER_FRAME侦听器,并且在该函数中定义了内联函数。这意味着每一个帧滴答(它与你的帧速率,而不是主时间线),这些函数将再次被创建,并且由于您将它们作为侦听器的处理程序添加,它们将永远留在内存中。

下面是一种编写代码的方法,展示了减少冗余和消除这些内存泄漏的方法。这假设如下:

  1. 舞台上有19个名为T1 - T19的物体,它们代表了可能的位置。
  2. 舞台上有19件作品,叫做P1 - P19,根据作品的正确位置,数字与T位置相关。 //让我们创建一个函数来随机化块位置函数seedPieces() {//创建一个由整数1-19 var unusedSpace:Vector组成的数组。=新向量.;var i:int;for (i = 1;i <= 19;i++) {//填充该数组unusedSpaces.push (i );} var curLocation:DisplayObject;//helper用于下面的循环:Sprite;//helper var用于//循环下的循环19次(从1-19开始)--(i= 1;i <= 19;( i++) { curPiece =这个“P”+i作为雪碧;//你可以这样得到这个片段,或者使用一个数组,如果你已经做了一个数组,比如pieces[i];跟踪(curPiece.name);//splice移除并返回指定索引处的项(在本例中为0和数组长度减去1之间的随机数)--第二个参数是要删除的项的数量(本例中仅1项) curLocation =此“T”+ unusedSpaces.splice(int(Math.random() * unusedSpaces.length),1)作为DisplayObject;trace(“",curLocation.name);//将片段移动到随机位置: curPiece.x =curation.Locx;Y= curLocation.y;}//现在,作为旁白,您应该使用一个循环来添加您的所有侦听器,以便保持理智--如果您将它们放在一个数组中,循环执行,或者使用这样的草率方式: for (var i:int = 1;i <= 19;i++) {Sprite(这个“P”+ i).addEventListener(MouseEvent.MOUSE_DOWN,fl_ClickToDrag);}//创建一个var来保存当前正在拖动的任何部分,这样您就可以知道在以后的var currentDraggingItem:Sprite;seedPieces();函数fl_ClickToDrag(事件:MouseEvent):currentDraggingItem {//将此单击项分配给currentDraggingItem var currentDraggingItem= event.currentTarget作为Sprite;//将此项作为Sprite的currentDraggingItem var currentDraggingItem=event.currentTarget中。//您可以对所有片段使用此单击处理程序//实际单击的片段由event.currentTarget currentDraggingItem.startDrag()引用;//既然鼠标当前处于下压状态(MouseEvent.MOUSE_UP,fl_ReleaseToDrop);//在拖动stage.addEventListener(Event.ENTER_FRAME,EntFrame)时侦听每个帧;}函数currentDraggingItem.parent.addChildAt(currentDraggingItem,0);(事件:MouseEvent):void{//如果currentDraggingItem有一个值,停止拖动它如果(currentDraggingItem) { currentDraggingItem.stopDrag();//发送到后面的currentDraggingItem.stopDrag}//移除鼠标向上,然后输入框架侦听器(既然鼠标已向上移动);stage.removeEventListener(Event.ENTER_FRAME,EntFrame);如果(checkComplete()){//游戏结束,请执行}函数EntFrame(e: Event) }:void {//当鼠标触摸正确的点if(currentDraggingItem){ if (thiscurrentDraggingItem.name.replace("P","T").hitTestPoint(mouseX,mouseY)) { currentDraggingItem.x = thiscurrentDraggingItem.name.replace("P",“T”).x时,这会将点按到正确的位置;currentDraggingItem.y = thiscurrentDraggingItem.name.replace("P","T").y;}}函数checkComplete():布尔{//使用一个循环来遍历所有的片段并检查它们是否在正确的位置。同样,您可以将它们放在数组中,也可以用惰性方式执行(var i:int = 1;i <= 19;i++) { if (!this"T"+i.hitTestObject(this"P"+i)) {返回false;}返回true;}
票数 0
EN

Stack Overflow用户

发布于 2015-07-30 14:16:08

一般来说,您可以使用以下代码进行洗牌:

代码语言:javascript
复制
var shuffledVector:Vector.<someClass> = new Vector.<someClass>;
while (originalVector.length > 0) {
    shuffledVector.push(originalVector.splice(Math.random() * originalVector.length, 1)[0]);
}

较长、解释的版本:

代码语言:javascript
复制
var shuffledVector:Vector.<someClass> = new Vector.<someClass>; //We will store our shuffled vector in here
var randomIndex:int;                                            //Random index from the originalVector
var resultVector:Vector.<someClass>;                            //result from the originalVector.splice(...) function
var randomElement:someClass;                                    //Random element from the originalVector

while (originalVector.length > 0) {                             //We will reduce the size of the originalVector until the originalVector is empty.
    randomIndex =  Math.random() * originalVector.length;       //Calculate a random index within the range of the originalVector from 0 to originalVector.lenght-1 (note that the range decreases by one on every loop)
    randomVector = originalVector.splice(randomIndex, 1);       //Use splice to remove one element at the randomly choosen index, we will receive a vector with the removed element...
    randomElement = randomVector[0];                            //...so we need to access the element
    shuffledVector.push(randomElement);                         //Add the randomly choosen element to our shuffled vector
}

我已经为向量编写了代码,我建议使用向量而不是数组,但是它背后的原理对于数组来说是一样的。

在你的例子中,originalVector是一个向量,充满了你的P1-P19运动,而someClass是MovieClip。originalVector在末尾是空的,可以被洗牌后的一个替换,当然,如果您将代码放在这样一个独立的函数中,那么这样做会更有意义:

代码语言:javascript
复制
function Shuffle(originalVector:Vector.<someClass>) : void {
    var shuffledVector:Vector.<someClass> = new Vector.<someClass>;
    while (originalVector.length > 0) {
        shuffledVector.push(originalVector.splice(Math.random() * originalVector.length, 1)[0]);
    }
    originalVector = shuffledVector;
}

偏离主题,但是对于进一步的编码很重要:其他人已经提到了,在每个帧上添加EventListeners是不好的,因为它是绝对不必要的。您只需要添加一次侦听器。您的代码非常重复,您应该使用一个接受MovieClip、x和y的函数,然后19次调用该函数。例如:

代码语言:javascript
复制
function setUpMovieClip(MC:MovieClip, x:int, y:int) : {
    MC.addEventListener(MouseEvent.MOUSE_DOWN, clickToDrag);
    //more code...
}

在clickToDrag函数中,您可以访问通过event.target属性单击的MovieClip:

代码语言:javascript
复制
function clickToDrag(e:MouseEvent) : {
    e.target.startDrag();
    //more code...
}

我希望你明白这个想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31719120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档