#javascript
#javascript
Вопрос:
Я пишу код для перемещения персонажа в браузерной игре. Мне удалось получить пиксели, которые он должен перемещать в секунду как по горизонтали, так и по вертикали.
pxsecx — это количество пикселей, которые он должен перемещать по горизонтали в секунду, pxsecy то же самое, но по вертикали
В принципе, это должно = их к текущему горизонтальному и вертикальному положению.
Мне нужно, чтобы цикл повторялся каждую секунду, пока позиция элемента не встретится с новой позицией (newx).
Это все, что я сделал:
<body onmousedown="showCoords(event)">
<script type="text/javascript">
function showCoords(evt){
oldx = parseInt(document.getElementById("character").style.left);
oldy = parseInt(document.getElementById("character").style.top);
width = parseInt(document.getElementById("character").style.width);
height = parseInt(document.getElementById("character").style.height);
newx = evt.pageX - width/2;
newy = evt.pageY - height/2;
disx = newx - oldx;
disy = newy - oldy;
diag = parseInt(Math.sqrt(disx*disx disy*disy));
speed = 50;
secs = diag/speed;
pxsecx = disx/secs;
pxsecy = disy/secs;
while(document.getElementById("character").style.left<newx)
{
document.getElementById("character").style.left = pxsecx;
document.getElementById("character").style.top = pxsecy;
}
}
</script>
Все работает до тех пор, пока я понятия не имею, как заставить это работать каждую секунду. Я тестирую его здесь: http://chusmix.com/game/movechar.php
Как мне заставить его повторять это раз в секунду, чтобы это работало?
Спасибо
Ответ №1:
JavaScript в основном асинхронный, поэтому вам нужно будет немного переписать это. setTimeout
выполняет функцию через определенное количество времени. Следовательно, вы можете сделать это:
(function move() {
var character=document.getElementById("character");
if(character.style.left<newx) {
character.style.left = pxsecx;
character.style.top = pxsecy;
setTimeout(move, 1000);
}
})();
Комментарии:
1. Спасибо за ваш ответ, не могли бы вы, пожалуйста, сказать мне, как включить его в мой скрипт. Я пытался, но я ужасен в javascript. Не могли бы вы просто вставить окончательный код? Я не знаю, как включить это в него. Большое спасибо
2. Просто замените им ваш текущий
while
цикл.3. Имеет ли значение, что значения, которые вы сравниваете в своем операторе if, не одного и того же типа.
if("100px" < 432)
кажется, всегда возвращает false . Похоже, что это не рабочий код, хотя он близок. Можете ли вы перепроверить? Я думаю, что как только ваши типы совпадут, это сработает, но не в этом текущем формате.4. @jmort253: Если бы они были обоими числами, но одно было в строке, это сработало бы. Это просто
"px"
из-за того, что оно не распознается как число. Я понял, что это не совсем сработает, когда я опубликовал это, но и исходный код OP тоже не сработал; Я думал, что это просто псевдокод, и они добавят другие переменные или исправят синтаксический анализ чисел позже.5. Отличный ответ. 1. На самом деле я потратил достаточно времени на работу с тем, что вы опубликовали, чтобы знать, что это сработает, если OP обработает часть удаления «px». Поскольку он принял ваш ответ, я предполагаю, что он действительно понял это 🙂
Ответ №2:
Вы можете использовать функцию setInterval(function, interval)
// To start the loop
var mainLoopId = setInterval(function(){
// Do your update stuff...
move();
}, 40);
// To stop the loop
clearInterval(mainLoopId);`
Комментарии:
1. Интервал (показанный 40 в этом примере) представляет миллисекунды.
Ответ №3:
Вам нужна функция JavaScript setTimeout()
. Он вызывает функцию каждые n миллисекунд.
Комментарии:
1. Миллисекунды, а не микросекунды.
2. Хотя вы можете использовать setTimeout для выполнения этого небольшого кодирования, вы должны искать setInterval, который сделает это за вас.
3. Это неверно.
setTimeout
вызывает функцию только один раз . Для повторного вызова используйтеsetInterval
.
Ответ №4:
Я создал класс coffescript для обработки временных циклов, возможно, это будет кому-то полезно.
# Classe TimeLoop, execute a function every x miliseconds
#
# @example How o create a loop
# myLoop = new TimeLoop((-> alert("loop"),1000)
# myLoop.start()
#
class window.TimeLoop
constructor: (@function,@miliseconds) ->
# Start loop.
#
start: -> @loop = setInterval @function, @miliseconds
# Stop loop.
#
stop: -> clearInterval(@loop)
ссылка на суть:https://gist.github.com/germanotm/6ee68f804860e2e77df0
Ответ №5:
чтобы повторять что-то каждую секунду, вам придется использовать установленный интервал:
let before = new Date();
setInterval(() => {
console.log(Math.round((new Date() - before) / 1000));
}, 1000);
этот код получает дату выполнения и вычитается из даты каждой секунды. (кстати, он начинается с единицы, а не с нуля, так что вам придется делать это вручную, если хотите)