我增加了基本的目标和应用拖放我的拼图,现在我有困难,使洗牌方面。在玩家完成或打开fla之后,每次都会在舞台的任意位置开始拼图。我理解如何使用数组进行洗牌,但我不确定如何做到这一点。我已经将我的19个拼图块的实例存储在数组中,但是现在我不知道如何处理这个数组。其他的教程都超出了我的范围,让我的头抓挠。
刚开始为flash专业人士编写代码,所以是的,任何帮助洗牌的电影剪辑(拼图片)将不胜感激。
这里是我的代码,我没有发布全部内容,因为从P1到P19基本上是复制粘贴:
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;
}
}发布于 2015-07-30 20:54:28
以下是我希望更全面的答案。
首先,丢弃那些内联函数。现在,您可以创建一个ENTER_FRAME侦听器,并且在该函数中定义了内联函数。这意味着每一个帧滴答(它与你的帧速率,而不是主时间线),这些函数将再次被创建,并且由于您将它们作为侦听器的处理程序添加,它们将永远留在内存中。
下面是一种编写代码的方法,展示了减少冗余和消除这些内存泄漏的方法。这假设如下:
T1 - T19的物体,它们代表了可能的位置。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;}发布于 2015-07-30 14:16:08
一般来说,您可以使用以下代码进行洗牌:
var shuffledVector:Vector.<someClass> = new Vector.<someClass>;
while (originalVector.length > 0) {
shuffledVector.push(originalVector.splice(Math.random() * originalVector.length, 1)[0]);
}较长、解释的版本:
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在末尾是空的,可以被洗牌后的一个替换,当然,如果您将代码放在这样一个独立的函数中,那么这样做会更有意义:
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次调用该函数。例如:
function setUpMovieClip(MC:MovieClip, x:int, y:int) : {
MC.addEventListener(MouseEvent.MOUSE_DOWN, clickToDrag);
//more code...
}在clickToDrag函数中,您可以访问通过event.target属性单击的MovieClip:
function clickToDrag(e:MouseEvent) : {
e.target.startDrag();
//more code...
}我希望你明白这个想法。
https://stackoverflow.com/questions/31719120
复制相似问题