Я пишу игру обороны башни. Он работал хорошо до этого момента, когда я пытаюсь создать снаряды:make element следовать за другим элементом
Мои башни создают элементы снарядов, когда крипы находятся в радиусе действия. Я хочу, чтобы эти снаряды переместились на ползучесть в положение X, Y, и когда он коснулся (отсюда такая же позиция), что-то должно срабатывать.
Не видели никакого хорошего примера. Я попытался: 1) Мгновенно установить положение снарядов в положение ползучести - это не удается, потому что удар мгновенно, и после этого происходит перемещение анимации. 2) Мгновенно установите положение снарядов в положение крипов, но на этот раз есть задержка перехода - это не срабатывает, потому что цель движется, и, таким образом, снаряд никогда не прикасается к ползучести.
Смотрите этот очень упрощенный пример:
var e = document.getElementById('test')
var g = document.getElementById('goal')
var i = 0;
var int = setInterval(function() {
i += 1;
g.style.left = i + 'px';
g.style.top = 50 + i + 'px';
e.style.top = g.style.top;
e.style.left = g.style.left;
if(e.getBoundingClientRect().left >= g.getBoundingClientRect().left && e.getBoundingClientRect().top >= g.getBoundingClientRect().top) {
console.log('boom');
}
}, 50)
#test, #goal {
width: 10px;
height: 10px;
top: 0;
left: 0;
background-color: #00f;
position: absolute;
transition: top 0.5s linear, left 0.5s linear;
}
#goal {
background-color: #f00;
top: 50px;
left: 0;
transition: top 0s, left 0s;
}
<div id="test"></div>
<div id="goal"></div>
3) рекурсивной функции в цикле бросали расстояние, которое отделяет снаряд от цели и добавить + 1px, пока расстояние не равно 0 - Это дает мне головную боль, так как элементы движутся очень странно через пространство, а во-вторых, это не является гибким, так как максимальная скорость движения - это рекурсия с задержкой 0,1 с, которая не так быстра и добавляет больше, чем +10px, каждый прогон может привести к тому, далеко.
здесь является то, что рекурсивная функция, которая может быть совершенно неправильный подход к перемещению элементов я предполагаю:
// move element function
function moveElement(el, dir, cb) {
if(!isPaused){
direction = dir;
// negative distance augment distance
if(el.dist[direction] < 0) {
el[direction]--;
el.dist[direction]++;
// positive distance reduce distance
} else if(el.dist[direction] > 0) {
el[direction]++;
el.dist[direction]--;
}
// update creep
(dir === 'x') ? el.e.style.left = `${el.x}px` : el.e.style.top = `${el.y}px`;
}
if (el.dist[dir] !== 0) {
setTimeout(function() {
return moveElement(el, dir, cb);
}, el.ms);
} else {
return cb(el, dir, cb);
}
}
// the projectile
// the creep class is actually quite similar
class Projectile {
constructor(field, creep) {
this.ms = 10;
this.x = field.x;
this.y = field.y;
this.follow = true;
this.e = createElement('div', `projectile projectile__${field.tower.name}`);
this.e.style.left = `${this.x}px`;
this.e.style.top = `${this.y}px`;
field.e.appendChild(this.e);
this.setupMove(this, creep);
}
setupMove(fromPos, toPos) {
this.dist = {
x: toPos.x - fromPos.x,
y: toPos.y - fromPos.y
};
if(this.dist.x !== 0) {
moveElement(this, 'x', (el) => { console.log(el.dist.x); }); }
if(this.dist.y !== 0) {
moveElement(this, 'y', (el) => { console.log(el.dist.y); }); }
}
}
Как бы вы написали эту функцию «движение»?
[T] - - - Creep
Благодаря
Задайте объект/идентификатор ползучести в снаряде. Затем каждый шаг расчета будет выполнен с помощью * текущей позиции ползучести, которую вы должны получить от ползучести. – Holger