2015-05-14 2 views
1

Я работаю над финальной системой битвы ATB, и в настоящее время я пытаюсь реализовать «функцию ускорения». Вместо того, чтобы ждать 6 секунд, прежде чем вы сможете действовать, поспешность позволит вам действовать в течение 3 секунд. Я в основном настраиваю пользователь объект, который имеет статус свойство, которое представляет собой пустой массив. Когда кнопка ускорения выполняется, я «нажимаю» слово «поспешность» в массив. Затем я делаю заявление, в котором говорится, что если у меня есть «статус спешки», тогда я буду действовать с таймером на 3 секунды до 6. Проблема, с которой я сталкиваюсь, заключается в том, что если у меня есть что-то другое, кроме «поспешности» в массив , этот эффект ломается. Например, если я нажму кнопку ускорения 3 раза, это будет толкать слово «поспешность» в массив 3 раза, что не является проблемой, поскольку я могу удалить его позже. Проблема, с которой я сталкиваюсь, заключается в том, что если в массиве не будет ничего, кроме одной «поспешности», этот эффект не будет работать, чего я не хочу, потому что в будущем я буду использовать его для ввода других статусные эффекты. Как я могу сказать свой код, что даже если другие элементы массива находятся в моем массиве, чтобы выполнить эффект?Моя функция «push array» не работает

function hasteButton() { 
    atbReset() 
    user.status.push("haste"); 
    console.log(user.status); 
}; 

var user = { 
    status: [] 
}; 

function timeBar(el, color) { 
    var elem = document.getElementById(el); 
    if (user.status == "haste") { 
     elem.style.transition = "width 3.0s, linear 0s"; 
     window.setTimeout(function() { 
      boxLight() 
     }, 2800); 
    } else { 
     elem.style.transition = "width 6.0s, linear 0s"; 
     window.setTimeout(function() { 
      boxLight() 
     }, 5800); 
    } 
} 
+1

В дополнение к тому, что уже было сказано ниже, Javascript помогает преобразовать массив в строку «поспешность», когда в массиве есть только один элемент. Если вы используете === вместо ==, конверсия не произойдет, и иногда ситуация не будет работать ... – PRB

ответ

3

В вашем коде есть ошибка: вы используете массив, но вы проверяете его как строку; изменить

if (user.status == "haste") { 

с

if (user.status.indexOf("haste") != -1) { 
+0

Благодарим вас за этот ответ, поскольку он отлично работает и соответствует тому, что я хочу делать в будущем с моей игрой. Спасибо :) – Shawn

1

Это звучит, как вы просто хотите установить свойство скорости, а не толкать элемент в массиве. Таким образом, вы можете просто проверить свойство напрямую, независимо от того, что еще находится в массиве, и настройка ускорения будет независима от других вещей в массиве. Массив для упорядоченного набора, но состояние haste, по-видимому, просто логическое состояние, независимо от того, что находится в массиве, поэтому оно не похоже на массив.

Вы можете просто сделать поспешность setting свойством массива состояния, как это:

function hasteButton() { 
    atbReset() 
    user.status.haste = true; 
    console.log(user.status); 
}; 

var user = { 
    status: [] 
}; 

function timeBar(el, color) { 
    var elem = document.getElementById(el); 
    if (user.status.haste) { 
     elem.style.transition = "width 3.0s, linear 0s"; 
     window.setTimeout(function() { 
      boxLight() 
     }, 2800); 
    } else { 
     elem.style.transition = "width 6.0s, linear 0s"; 
     window.setTimeout(function() { 
      boxLight() 
     }, 5800); 
    } 
} 
0

В своем коде вы имеете: user.status. Этот вызов вернет массив, вам нужно будет так или иначе получить доступ к его элементам.

Я рекомендовал бы делать что-то вроде:

if (user.status.indexOf('haste') >= 0) { 
    // do action 
} 

indexOf метод на массивах возвращает -1, если элемент, который вы попросите его найти индекс не в массиве.

+0

'> 0' не найдет 0-ю позицию (например,' ["haste"] '). – Amadan

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