【问题标题】:Have object rotate another object in array?有对象旋转数组中的另一个对象吗?
【发布时间】:2016-11-09 22:26:14
【问题描述】:

大家好,所以我有一个对象character,它最初围绕名为planet 的第一个电影剪辑旋转,它不属于数组。所以用户可以点击屏幕,character 会朝它旋转的方向射击。目标是让character 撞击阵列中的其他行星,然后它开始像原来的一样围绕它旋转。一切正常,除了当我拍摄角色并且它落在aPlanetArray 中的outerplanets 之一时,它并没有开始围绕那个新星球旋转,而是消失了。

我是这样设置的:

字符轨道第一个不在阵列中的行星只是将其作为初始轨道,然后在离开其他外行星后将其移除:

private function startOrbit():void 
    {
        //add Planet 
        planet.x = (stage.stageWidth / 2);
        planet.y = (stage.stageHeight / 2) + 100;
        stage.addChild(planet);

        //radnom number set up in main class 
        if (randomOrbit == 1) //If equals to one then clock wise 
        {
            clockWiseOrbiter(); 
        }else
        if (randomOrbit == 2) //If equals to one then counter clock wise 
        {
            counterClockWiseOrbiter();
        }

    }

我在数组中添加外行星:

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);

        }
    }

在我的输入帧处理程序中:

private function logicHandler(e:Event):void 
    {
        if (!tap && !nextlevel)
        {
            startOrbit(); //start player orbit around planet
        }

        if (nextlevel)
        {
            startNewOrbit();
            trace("Starting new Orbit");
        }

        //When tapped have outher planets move down


        if (tap)
        {
            characterTap(); //Character shoots from position
        }

        collisionPlanetHandler();
    }

当与外行星发生碰撞时:

**** 编辑*****

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

            if (character.hitTestObject(currentPlanet[i]) && !nextlevel)
            {
                trace("HIT");
                //Have charcter orbit that planet
                //startNewOrbit();

                //tap back to false
                tap = false;
                nextlevel = true;
                character.destroy();
                planet.destroy();
                planetHit = currentPlanet[i];
            }
        }
    }

当角色与数组中的外行星发生碰撞时,我会在它着陆的外行星周围发生新轨道。或者我至少尝试一下:

private function startNewOrbit():void 
    {
        newClockWise();
    }

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

            stage.addChild(character);
            character.rotation = (Math.atan2(character.y - currentPlanet.y, character.x - currentPlanet.x) * 180 / Math.PI);


            var rad:Number = angle * (Math.PI / 180); // Converting Degrees To Radians
            character.x = currentPlanet.x + radius * Math.cos(rad); // Position The Orbiter Along x-axis
            character.y = currentPlanet.y + radius * Math.sin(rad); // Position The Orbiter Along y-axis
            angle += speed; // Object will orbit clockwise
        }

    }

我知道我在 startNewOrbitnewClockWise 函数中做错了。我有一个 for 循环,我试图在它接触的数组中定位对象。我使用这个var currentPlanet:mcOuterPlanets = aPlanetArray[i]; 但不确定我是否需要使用currentObject 或类似的东西。有谁知道我做错了什么,为什么它没有绕着它接触的新行星运行,而是完全消失了?

【问题讨论】:

  • “开始新轨道”是否被追踪?
  • 是的,它确实被追踪了。
  • 您的新顺时针函数循环遍历所有行星并将角色放置在数组中每个行星的 X/y 位置,并在每一帧都执行此操作。对?为什么?
  • 不,没关系。好好休息。
  • 显然你不能只是复制粘贴这段代码。这是伪代码,但既然你知道如何循环遍历数组并进行命中测试等等……这个例子只是说明了这个想法。让我知道它是否没有意义。

标签: arrays actionscript-3 rotation


【解决方案1】:
var planetHit:MovieClip;

function collisionTest():void{
    for (loop through planets){
        if (planet[i].hitTestObject(character)){
            planetHit = planet[i];
        }
    }
}

现在查看数组中那个位置的行星 (==) planetHit 所以你可以这样做

character.x = planetHit.x;

planetHit.addChild(character);

等等

【讨论】:

  • 修改为在任何函数之外包含变量声明
  • 我了解您在这里所做的唯一问题是当我执行此操作时“如果 (character.hitTestObject(currentPlanet[i]) && !nextlevel)”我收到此错误:在 mcOuterPlanets 和没有默认值。
  • 将整个函数发布为编辑(点击帖子下方的编辑)
  • 是的,您不需要 [i],因为您已经说过 currentPlanetaPlanetArray[i]
  • 好的,它现在完美运行。正如你所说,我删除了整个 Loop 语句以及 [i] 并且一切运行顺利,感谢 Neal 抽出时间。
最近更新 更多