大家好,所以我现在已经有一段时间了,我正在努力找出解决这个问题的最佳方法。所以我有一个名为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 :(得分: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);
明白了吗?
此外,您还需要移除远离玩家的行星以防止减速。或者你可以简单地将那些远远地移动到顶部以回收它们而不是一直创建新的行星。
答案 1 :(得分:2)
草稿示例......
@Nathan,Neal Davis和往常一样,但我会推送Vector,然后将addChild推送到当前索引......如果可以,请避免使用Arrays。 (如果实例是由同一个类制作的)。
scala> (Json.parse("""{"results":[{"a":1,"b":2},{"a":1,"b":2}]}""") \ "results").as[JsArray]
res26: play.api.libs.json.JsArray = [{"a":1,"b":2},{"a":1,"b":2}]
[编辑]
如果您选择制作MovieClip Vector(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)
来获取方法
你的McOuterPlanets方法!
因此,对于MovieClip的Vector(aPlanetArray == .MovieClip),如果您想使用McOuterPlanets方法的方法,您必须这样做:
aPlanetArray[i] as McOuterPlanets
。
然后你可以拨打var outerP : McOuterPlanets = aPlanetArray[someIndex] as McOuterPlanets;
仅仅因为McOuterPlanets扩展了MovieClip类。
如果您必须在向量中添加不同类型的数据,请不要使用向量,而是使用数组类。
这会有效,但这完全是胡说八道! 示例:
outerP.someMethodOfMcOuterPlanets();
[/编辑]
我希望这可能有所帮助。
检查参考:
ActionScript 3 fundamentals: Arrays
ActionScript 3 fundamentals: Associative arrays, maps, and dictionaries