在舞台上移动物体

时间:2014-01-13 21:23:38

标签: actionscript-3 flash actionscript

假设我在一个数组中有5个对象,我将它们沿着x轴移动,如下所示:

vx = 5;

for (i:int = 0; i < objects.length; i++)
{
 objects[i].x += vx;
}

我想这样做。 如果数组'objects'中的任何对象命中PointA,则将该数组中的所有对象移动到左侧,例如set vx * = -1;

我只能这样做:

for (i:int = 0; i < objects.length; i++)
{
 // move right
 objects[i].x += vx;

 if (objects[i].hitTest(PointA))
 {
  // move left
  vx *= -1;
 }
}

这将改变对象的方向,但我需要等待所有对象点击PointA。

如何改变数组中所有对象的方向,如果有任何对象命中了PointA?

2 个答案:

答案 0 :(得分:0)

我不知道动作脚本但是你应该在for循环之外设置一个布尔值,比如bGoingRight

检查这是否为真,并将对象向右移动,如果错误则移动对象。当您传递hitTest时,您应该将布尔值更改为false。

粗略的例子

  var bGoRight:Boolean = true;

  for (i:int = 0; i < objects.length; i++)
  {
    if(bGoRight)
    {
    // move right
    objects[i].x += vx;
    }
    else
    {
     // move left
     vx *= -1;
    }

    if (objects[i].hitTest(PointA))
    {
     // if any object hit the point, set the flag to move left
     bGoRight = false;
    }
 }

答案 1 :(得分:0)

因此,您需要检查已经命中PointA的对象,存储它们,然后检查更新的存储计数是否等于您的对象数组。然后,当满足该情况时,您可以更改vx变量。这看起来像这样:

//set a variable for storing collided object references
//note: if you are doing this in the IDE remove the 'private' attribute
private var _contactList:Array = [];

for (i:int = 0; i < objects.length; i++)
{
     // move right
     objects[i].x += vx;

     if (objects[i].hitTest(PointA))
     {
          if( contactList.length == objects.length ) {
             // move left
             vx *= -1;
             //clear our contact list
             contactList.length = 0;
           } 
           else if ( noContact( objects[i] ) ) {
               contactList.push( objects[i] );
           }
     }
}

然后是else if语句noContact()中的函数,如果您在IDE中执行此操作,则需要删除private属性。

private function noContact( obj:* ):Boolean {
    if ( contactList.indexOf( obj ) != -1 ) {
        return false;
    }
    return true;
}

你可以这样做的另一种方法就是这样(一种布尔方式,如另一个答案所述),但依赖于你的存储设置正确:

//set this variable for directionRight (boolean) 
private var directionRight:Boolean = true;

for (i:int = 0; i < objects.length; i++)
{
     // move right
     objects[i].x += vx;

     if (objects[i].hitTest(PointA))
     {
          //we are moving to the right, object[i] is the last object
          if( i == objects.length-1 && directionRight ) {
             // move left
             directionRight = !directionRight;
             vx *= -1;
           } 
           else if ( i == 0 && !directionRight ) ) {
               // move right
               directionRight = !directionRight;
               vx *= -1;
           }
     }
}