2016-11-11 43 views
1

嘿大家好,我已经在这一段时间了,我正试图找出解决这个问题的最佳方法。所以我有一组名为outerPlanets的影片剪辑对象,它们被添加到一个名为aPlanetArray的数组中,这样阵列中的这些行星就会被添加到舞台上,并且它们之间的间距都是全部。当玩家触摸屏幕时,角色在另一个行星上跳跃,行星在+ y轴上向下滚动以保持角色位于中心位置。如何将影片剪辑添加到数组?

我给舞台增加了10个行星,因为性能问题我不想增加很多并且失去FPS,所以我的想法是阵列变得很低时,比如行星阵列是< = 5然后添加更多的行星到最后一颗行星的最高位置。希望我有道理。把它看作是一堆一块一块倒下的块,随着越来越多的块落下,所以它永远不会结束。

这是我如何将它们添加到舞台:

//Instantiate Arrays 
     aPlanetArray = new Array(); 

     //Numbers 
     xSpacing = 100; 
     ySpacing = 200; 
     startPoint = new Point((stage.stageWidth/2), (stage.stageHeight/2)); 


     addOuterPlanets(); 

private function addOuterPlanets():void 
    { 
     for (var i:int = 0; i < nPlanets; i++) 
     { 
      outerPlanets = new mcOuterPlanets(); 
      outerPlanets.x = startPoint.x + (xSpacing * i); 
      outerPlanets.y = startPoint.y - (ySpacing * i); 
      stage.addChild(outerPlanets); 
      aPlanetArray.push(outerPlanets); 

     } 
    } 

我当时可以想出的唯一事情是这样的:

if (aPlanetArray.length <= 5) 
     { 
      addOuterPlanets(); 
     } 

这增加了一组新的行星,但当然只是将它们添加到舞台的中心,而不是其他行星的顶部。任何想法如何做到这一点?

进展情况:

private function collisionPlanetHandler():void 
    { 
     for (var i:int = 0; i < aPlanetArray.length; i++) 
     { 
      var currentPlanet:mcOuterPlanets = aPlanetArray[i]; 

      planetContainer.addChild(aPlanetArray[i]); 

      if (character.hitTestObject(currentPlanet) && !nextlevel) 
      { 
       trace("HIT"); 
       yDown = (stage.stageHeight/2) - (currentPlanet.y - 200); //have object tween to center of stage or where was last positioned 
       //tap back to false 
       tap = false; 
       nextlevel = true; 
       if (!bNullObject) // have null object so doesnt loop again and cause error for planet == null 
       { 
        planet.destroy(); 
        planet = null; 
       } 
       bNullObject = true; 
       planetHit = currentPlanet; // to land on correct planet 
       aPlanetArray.splice(i, 1); 
       randomRotation = randomNumber(1, 2); //Stop in random rotation for next planet 

       TweenLite.to(planetContainer, 2.0, { y:yDown, ease:Elastic.easeOut }); 


       planetIncrement -= 300; 
       addPlanet(randomNumber((stage.stageWidth/2) - 220, ((stage.stageWidth/2)) + 220), planetIncrement); 

      } 

     } 



    } 
+0

尝试:aPlanetArray.insertAt(aPlanetArray.length - 1,影片剪辑); – kare

+0

为什么不把移动到屏幕底部的行星移动到顶部。就像if(planet.y> stage.stageHeight){planet.y = -20; planet.x = random;}因为即使你一次只添加10个,如果有人玩你的游戏40分钟,该怎么办?屏幕上会计算出一吨行星。这可能导致减速。您应该重新使用它们或将其删除 –

回答

2

示例代码

function gameSetup():void{ 
    setupUsers(); 
    loadSounds(); 
    createLevel(_level1); 
    addInitialPlanets(); 
    addCharacter(); 
} 

private function addInitialPlanets():void{ 
    for (var i:int = 0; i < nPlanets; i++){ 
     addPlanet(startPoint.x + xSpacing * i, startPoint.y + ySpacing * i); 
    } 
} 

private function addPlanet(xPos:Number, yPos:Number):void{ 
    p = new mcOuterPlanets(); 
    // var p:mcOuterPlanets = new mcOuterPlanets(); // this is preferred method 
    p.x = xPos; 
    p.y = yPos; 
    stage.addChild(p); 
    // addChild(p); // this is preferred method 
    aPlanetArray.push(p); 
} 

现在,当您需要添加另一个星球上面的人做

addPlanet(xPos, yPos); 
// where xPos is desired X and yPos is desired y 

你看看这里发生了什么?我通过使用单独的功能来定位地球。您也可以卸载与添加行星相关的其他任务。想象一下这样的事情:

addPlanet(xPos, yPos, color, size, speed, ringCount); 

想到这个主意吗?

此外,您还需要移除远低于玩家的行星以防止放慢速度。或者你可以简单地将那些远低于顶端的那些移动到顶端来回收它们,而不是始终创建新的行星。

+0

嘿尼尔谢谢你的男人。这看起来很棒。我试着实现它,并让你知道它是如何发展的 – Nathan

+0

所以我明白你得到的东西我唯一遇到的麻烦是如何使用xPos和yPos在新的行星上添加其他行星容器。 – Nathan

+0

你会做'addPlanet(10,-40)'​​。这将把它放在X的10和y的-40 –

2

例如草案...

@Nathan,尼尔·戴维斯是对像往常一样,但我推矢量,那么它的addChild当前索引到...如果你能避免的阵列。 (如果实例是由同一个类创建的)。

var aPlanetArray:<Vector>.MovieClip = new <Vector>.MovieClip(10); 
// or new <Vector>.MovieClip(); if You don't want to restrict the amount of items in the Vector. 
// or new <Vector>.McOuterPlanets() if McOuterPlanets is a Class. 

private function addOuterPlanets():void { 
    for (var i:int = 0; i < nPlanets; i++){ 
     aPlanetArray.push(new mcOuterPlanets()); 
     aPlanetArray[i].x = startPoint.x + (xSpacing * i); 
     aPlanetArray[i].y = startPoint.y - (ySpacing * i); 
     addChild(aPlanetArray[i]); 
}; 

[编辑]

如果您选择让影片剪辑的矢量(var aPlanetArray:<Vector>.MovieClip = new <Vector>.MovieClip(10)), 您必须使用aPlanetArray[i] as McOuterPlanets获得的 你McOuterPlanets方法的方法! 所以,在Vector的MovieClip(aPlanetArray == .MovieClip)的情况下,如果您想使用McOuterPlanets方法的方法您必须这样做: var outerP : McOuterPlanets = aPlanetArray[someIndex] as McOuterPlanets;。 然后你可以拨打outerP.someMethodOfMcOuterPlanets();

只是因为McOuterPlanets扩展了MovieClip类。

如果必须在Vector中添加不同类型的数据,请改用Array类。

这将有效,但这是棘手的总废话! 实施例:

var vectorOfStrings:Vector.<String> = Vector.<String>([["a","b","c"],["d","e","f"]]); 
// this works and Your Vector contains only Strings so OK. 
trace(""); 
trace("length of the Vector = " + vectorOfStrings.length); 
trace("vectorOfStrings.toString() = " + vectorOfStrings.toString()); 
trace("vectorOfStrings[0] = " + vectorOfStrings[0]); 
trace("vectorOfStrings[1] = " + vectorOfStrings[1]); 

var vectorOfArrays:Vector.<Array> = Vector.<Array>([["a","b","c"],[1,2,3]]); 
// this works but this is tricky an total nonsense 
// use the Array Class instead! 
trace("\n NEVER DO THIS! Use the Array Class instead!"); 
trace(" NONSENSE!"); 
trace("length of the Vector = " + vectorOfArrays.length); 
trace("vectorOfArrays.toString() = " + vectorOfArrays.toString()); 
trace("vectorOfArrays[0] = " + vectorOfArrays[0]); 
trace("vectorOfArrays[1] = " + vectorOfArrays[1]); 

[/编辑]

我希望这可能会有帮助。

检查到基准为:

ActionScript 3 fundamentals: Arrays

ActionScript 3 fundamentals: Associative arrays, maps, and dictionaries

ActionScript 3 fundamentals: Vectors and ByteArrays

+1

Thx对于您的反馈@Nathan,我希望这会有所帮助。 正如你在我提供的数组是否来自一种类制造环节看,你最好选择一个向量来存储您的实例。 Vector假设每个实例的类型都很好(MovieClip,Sprite,Number,uint,String ...)。 这可能会避免很多错误或错误,这些错误可能很难在以后进行调试。 此致敬礼。 尼古拉斯 – tatactic

+0

编辑澄清这个东西@Nathan 只要让我知道,如果编辑是明确的... – tatactic

+0

不要忘了@NealDavis答案!反馈总是欢迎! – tatactic