As3 Как добавить ускорение к ограниченному движению?

Для игры в лабиринт я пытаюсь добавить ускорение движению моего персонажа. Поскольку персонаж не должен проходить сквозь стены, функция движения и хиттач находятся в одной и той же функции.

Я попытался добавить ускорение в операторы if в этой функции, но это не работает должным образом. Может кто подскажет, куда ставить код ускорения и зачем туда?

Вот как я думал, что это было сделано, но не работает:

    function walkingX(anEvent: Event): void
    {


      var newx: Number = mc.x - (isLeft ? xspeed : 0) + (isRight ? xspeed : 0);
      var newy: Number = mc.y - (isUp ? yspeed : 0) + (isDown ? yspeed : 0);

      if(!boundsBmpData.hitTest(new Point(bounds.x, bounds.y),
                                255,
                                mcBmpData,
                                new Point(newx, newy),
                                255))
      {
         mc.x = newx;
         mc.y = newy;
      }

if(isDown==true && yspeed<maxspeed){yspeed+=2}
if(isUp==true && yspeed>-maxspeed){yspeed-=2}
if(yspeed>0){yspeed-=accel}
if(yspeed<0){yspeed+=accel}

if(isRight==true && xspeed<maxspeed){xspeed+=2}
if(isLeft==true && xspeed>-maxspeed){xspeed-=2}
if(xspeed>0){xspeed-=accel}
if(xspeed<0){xspeed+=accel}

    }

person Opoe    schedule 18.12.2011    source источник


Ответы (1)


Я думаю, вам нужно удалить эти строки:

if(yspeed>0){yspeed-=accel}
if(yspeed<0){yspeed+=accel}
...
...
...
if(xspeed>0){xspeed-=accel}
if(xspeed<0){xspeed+=accel}

Причина в том, что он вычитает из логики над ним.

Что касается ускорения, вы, вероятно, не хотите увеличивать значение скорости на константу "2". Я бы поместил это в переменную или статику, объявленную выше (чтобы вы могли изменить ее только в одном месте, а не везде, где она используется.

Наконец, чтобы получить эффект «ускорения», вы должны увеличить скорость, умножив ее на дробь.

Как это:

if(isDown==true && yspeed<maxspeed){yspeed *= 1.05}

Или со статической константой

public static const MOVEMENT_SPEED:int = 1.05;
...
...
...
if(isDown==true && yspeed<maxspeed){yspeed *= MOVEMENT_SPEED}
person Dominic Tancredi    schedule 18.12.2011
comment
Спасибо за отличное объяснение. Так что мне даже не нужно var accel:Number=0.5; ? - person Opoe; 18.12.2011
comment
Можете ли вы сказать мне, почему это не работает: if(isDown==true && yspeed‹maxspeed){yspeed *= ускорение} - person Opoe; 18.12.2011
comment
Вы можете использовать var accel:Number=1.5 (или 1.1 или 1.05). Ошибка возникает из-за вашего значения ускорения, что означает, что вы умножаете на 0,5. Это значение, если подумать, УМЕНЬШИТ вашу скорость (что составляет половину от 10? 5. что составляет половину от 5? 2,5), а не умножает на 1,5 (что составляет один И половина от 10? 15) - person Dominic Tancredi; 18.12.2011
comment
Ммм, нет, НЕ умножайте xspeed/yspeed на число. Прибавь к нему число, а не умножай!!! Он не должен экспоненциально увеличиваться. - person apscience; 19.12.2011
comment
Арифметика против линейной прогрессии... это все, что он хочет. - person Dominic Tancredi; 19.12.2011