2014-01-14 3 views
0

У меня есть некоторые враги в массиве, они движутся влево и вправо. Простой код, который обновляет врагов позиции:Пространство между движущимися объектами

// when the game starts, moveRight is true 
var moveRight:Boolean = true; 

for (var i:int = 0; i < enemies.length; i++) 
{ 
if(moveRight) 
{ 
// they are moving right 
enemies[i].vx = 2; 
} 
else 
{ 
// they are moving left 
enemies[i].vx = -2; 
} 

// limit movement 
if (enemies[i].x >= 550) 
{ 
moveRight = false; 
} 
else if (enemies[i].x <= 50) 
{ 
moveRight = true; 
} 

// move enemies 
enemies[i].x += enemies[i].vx; 

} 

Проблема: Каждый раз, когда враги ударил левой boudary (х < = 50), пространство между 1 и 2 враг становится все больше. Im не хорошо объяснить вещи на английском, так что я загрузил довольно основной .swf пример здесь:

http://www.fastswf.com/GXKix5s

Просто посмотреть, что происходит с противником на левой стороне.

я могу решить эту проблему, добавив одну строку кода (новый код ниже) внутри если-другое заявление:

if (enemies[i].x >= 550) 
{ 
moveRight = false; 
} 
else if (enemies[i].x <= 50) 
{ 
moveRight = true; 
// NEW CODE 
enemies[i].x += 2; 
} 

Он работает даже с несколькими строками, вы можете увидеть здесь

http://www.fastswf.com/icsom6A

Итак, вопрос в чем проблема? Почему пространство между врагами становится все больше, когда они меняют свое направление слева направо? Если я петлю troguh массив назад, у меня проблема с правой стороны, а не слева.

ответ

0

Это происходит, потому что когда moveRight установлен в true, из-за того, что враги [0] .x меньше или равны 50, у врагов [0] уже установлена ​​скорость до -2.

Так что, когда цикл moveRight установлен в true, враги [0] перемещаются на -2 пиксела, а затем устанавливают moveRight в true, чтобы все остальные враги больше нуля перемещались +2.

Один из способов исправить это было бы перенести проверку вне цикла (только проверка первого и последнего врага):

for (var i:int = 0; i < enemies.length; i++) 
{ 
    if(moveRight) 
    { 
     // they are moving right 
     enemies[i].vx = 2; 
    } 
    else 
    { 
     // they are moving left 
     enemies[i].vx = -2; 
    } 

    // move enemies 
    enemies[i].x += enemies[i].vx; 
} 

// limit movement 
if (enemies[enemies.length-1].x >= 550) 
{ 
    moveRight = false; 
} 
else if (enemies[0].x <= 50) 
{ 
    moveRight = true; 
} 

Другой мог бы иметь две петли:

for (var i:int = 0; i < enemies.length; i++) 
{ 
    // limit movement 
    if (enemies[i].x >= 550) 
    { 
     moveRight = false; 
    } 
    else if (enemies[i].x <= 50) 
    { 
     moveRight = true; 
    } 
} 

for (var i:int = 0; i < enemies.length; i++) 
{ 
    if(moveRight) 
    { 
     // they are moving right 
     enemies[i].vx = 2; 
    } 
    else 
    { 
     // they are moving left 
     enemies[i].vx = -2; 
    } 

    // move enemies 
    enemies[i].x += enemies[i].vx; 
} 
+0

Я добавил пример ответа – imcg

+1

Да, мне нужно 2 цикла, и теперь он отлично работает, отличный ответ, спасибо. –

Смежные вопросы