Игра AS3 Flash Pong: ракетка AI не двигается должным образом

Итак, у меня есть следующий код, выражающий движение «ИИ». pdl_R — весло AI, AIH — высота AI, AIHS — скорость AI Height. Я хочу, чтобы код перемещал весло на AIH в направлении AIHS.

pdl_R.y=AIH;
AIH+=(3*AIHS);  
if(pdl_R.y==stage.stageHeight || pdl_R.y==stage.stageHeight-pdl_R.height)
{
    AIHS*=-1;
}

Но когда pdl_R (манипулятор AI) достигает нижней части экрана (вниз — это направление по умолчанию), он остается там и мерцает вверх и вниз на 3 пикселя (вместо ожидаемого переключения направления).

Мой начальный AIH равен 200, а мой первоначальный AIHS равен 1.


person mechanicarts    schedule 07.11.2012    source источник


Ответы (2)


Когда ваш AIH достигает stage.stageHeight, происходит следующее:

  1. Y присваивается stage.stageHeight (==AIH)
  2. AIH увеличивается на 3*AIHS (==3, при условии, что AIHS==1, хотя фактическое значение AIHS не имеет значения, имеет значение только его знак). Поэтому ваша ракетка на самом деле перемещается на 3 пикселя больше, чем вы хотите.
  3. Вы проверяете условие, оно верно, поэтому AIHS=-1*AIHS. AIHS сейчас -3.
  4. Итак, в следующем кадре Y присваивается AIH (==stage.stageHeight+3), AIH увеличивается на AIHS и теперь снова равен stage.stageHeight. Условие проверки ложно, никаких изменений в AIHS. Весло теперь движется вверх.
  5. В следующем кадре Y присваивается значение AIH, равное stage.stageHeight, но теперь ракетка движется вверх! Итак, когда вы снова проверяете свое состояние, AIHS возвращается к +3. Причем, AIH уже stage.stageHeight-3, так что через 2 кадра цикл повторится.

Исправление будет состоять в том, чтобы увеличить AIH после того, как вы измените AIHS. Это на самом деле самая распространенная причина ошибок, вы сначала применяете неизменённое значение, а затем меняете его, вместо того, чтобы сначала изменить, а затем применить.

person Vesper    schedule 07.11.2012
comment
Спасибо вам обоим... правильный код был pdl_R.y=AIH; if(pdl_R.y<=0+pdl_R.height/2 || pdl_R.y>=stage.stageHeight-pdl_R.height/2) { AIHS*=-1; } AIH+=(3*AIHS); - person mechanicarts; 07.11.2012

В следующем операторе if:

if(pdl_R.y==stage.stageHeight || pdl_R.y==stage.stageHeight-pdl_R.height)
{
    AIHS*=-1;
}

Используя некоторые примерные цифры для высоты лопасти (30) и высоты сцены (600), вы спрашиваете:

if(paddle.y == 600 || paddle.y == 570)
{
  ReversePaddleDirection
}

Это могло бы объяснить, как весло застревает на дне, так как оно всегда будет подпрыгивать между 570 и 600, реверсивным движением, как только оно достигает одного или другого.

Если это не так, мы могли бы использовать дополнительную информацию (например, фактическую высоту сцены и высоту лопастей) для дальнейшей отладки.

person Simon McArdle    schedule 07.11.2012