2014-01-13 5 views
0

Скажем, у меня есть 5 объектов в массиве и переместить все их вдоль оси х, как это:Перемещение объектов на сцене

vx = 5; 

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

Я хотел бы сделать это. Если какой-либо объект из объектов массива попадает в PointA, переместите все объекты из этого массива в левую сторону, например, установите 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; 
} 
} 

Это изменит направление объекта, но мне нужно ждать все OBJETS ударил точке А.

Как изменить направление всех объектов в массиве, если любой из них попал в PointA?

+0

Похоже, что вы хотите изменить направление один раз ** любой ** ваших объектов прибывает в пункт назначения, правильно? Вы не пытаетесь восстановить их все в исходное состояние мгновенно, но, скорее, продолжать постепенно перемещать их в обратном порядке, как только вы достигнете PointA? – Atriace

ответ

0

Я не знаю, сценарий действия, но вы должны установить логическое значение вне цикла, как 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; 
    } 
} 
+0

Я не уверен, если вы поймете мой вопрос. –

+0

Я могу легко сделать, если object1 hit pointA переместить объект1 влево, а затем, если object2 ударил PointA, переместите объект2 влево и т. Д. Но как сделать, если object1 ударил PointA, переместите все остальные объекты влево, а не только object1? –

+0

Все объекты будут идти влево, если для bGoRight установлено значение false, потому что вы проверите это, когда вы их нарисуете. Поэтому, когда объект попадает на PointA, просто переключите bGoRight с true на false. – JMG

0

Так что вам нужно проверить объекты, которые уже пострадали точке А, хранить их, а затем проверить, если обновленный счетчик хранения эквивалентно массиве объектов. Затем, когда этот случай будет выполнен, вы можете изменить переменную 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]); 
      } 
    } 
} 

Тогда функции в другом, если оператору 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; 
      } 
    } 
} 
Смежные вопросы