Как решить эту проблему setInterval? - PullRequest
0 голосов
/ 26 октября 2011

У меня проблемы с setInterval. В моей игре я хочу, чтобы игрок мог стрелять, но каждый раз, когда он стреляет, стрелки идут быстрее! Это конструктор стрелки:

arrows = [];

Arrow = function(x, y, followX, followY) // (player.x, player.y, followX, followY)
{
     ar = this;

     ar.rect = [x, y, 28, 3];

     ar.x = x;
     ar.y = y;

     ar.followX = followX;
     ar.followY = followY;

     if(ar.followY - ar.y < 0)
     {
          ar.where = [-(((ar.followX - ar.x)/200)/((ar.followY - ar.y)/200)), -1];
     }
     else
     {
          ar.where = [(((ar.followX - ar.x)/200)/((ar.followY - ar.y)/200)), 1];
     }

     ar.flying = setInterval(function()
     {
          ar.rect[0] += ar.where[0]/10;
          ar.rect[1] += ar.where[1]/10;
     }, 1);

     ar.fall = setTimeout(function()
     {
          for(a = 0; a < arrows.length; a++)
               if (arrows[a] == ar)
               {
                    clearInterval(ar.flying);
                    arrows = sliceHere(arrows, a);
               }
     }, 1000);
}

Таким образом, общая идея заключается в том, что стрелка летит в течение одной секунды, а затем удаляется.

Вот так и создается стрелка:

fireArrow = function(player)
{
     arrows.push(new Arrow(player.rect[0] + player.rect[2] - 1, player.rect[1] + player.rect[3]/2 - 10, player.rect[0] + player.mouse.x - sx/2, player.rect[1] + player.mouse.y - sy/2));
}

После этого я просто рисую стрелки на экране, я также всегда стреляю из одного и того же места и в одном направлении.

1 Ответ

4 голосов
/ 26 октября 2011

Не уверен, что это единственная проблема, но вы должны изменить эту строку:

ar = this;

до

var ar = this;

И то же самое для вашего a счетчика петель.

В настоящее время вы нигде не используете var, что означает все ваших переменных глобальные.

Что, в общем, приведет к путанице всех видов, но, в частности, означает, что если вы запустите несколько стрел, каждая из них сбросит свою собственную setInterval, но ссылки на ar в функции интервала будут ссылаться на все в одну и ту же глобальную переменную, и поэтому все переместят последнюю запущенную стрелку, что увеличит ее скорость.

Объявите ar с помощью var, и он станет локальным для функции Arrow (но все еще доступен для функций, вложенных в эту функцию, таких как те, которые вы создаете для setInterval). Магия замыканий означает, что каждый из ваших интервалов будет ссылаться только на теперь локальный ar из окружающей области, и каждая стрелка станет должным образом независимой.

Единственный раз, когда вы должны когда-либо использовать переменную, не объявляя ее с помощью var, это когда вы специально хотите создать глобал из функции. И даже тогда вы должны спросить себя, лучший ли это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...