Сбой массива с несколькими объектами с таймерами истечения
Я делаю игру на HTML5, и теперь у меня возникла тревожная проблема.
В моей игре у меня есть массив со всеми частицами, у всех частиц есть таймеры истечения, с разными случайными сгенерированными задержками.
Когда истекают таймеры истечения, они удаляют свой собственный объект с помощью функции Array.splice (), что вызывает проблемы, поскольку функция Array.splice () испортит порядок массива.
Сначала у меня была такая функция: (n = частицы крови, чтобы появиться, а x и y = начальная точка.) (Все частицы распространяются в случайных направлениях от середины, а затем они замедляются трением)
function spawnBlood(x, y, n) {
for (var i = 0; i < n; i++) {
var tetra = Math.floor(Math.random() * 360) * (180 / Math.PI)
var speed = Math.floor(Math.random() * 4) + 3
var j = particles.length
particles.push({
, x: x,
y: y,
vx: Math.cos(tetra) * speed,
vy: Math.sin(tetra) * speed,
r: 1.5,
angle: 0,
expireTimer: setTimeout(function(j) {
return function() {
particles.splice(j, 1)
}
}(j), Math.floor(Math.random() * 500) + 500),
})
}
}
Тогда у меня была такая функция, и у меня больше не было функции сращивания, так что это не создаст проблем с порядком массивов, но все же есть одна проблема: при циклическом перемещении массива для изменения значений x и y, например, для применения трения, происходит сбой. , Ошибка вызвана тем, что он не может определить значения из нуля:
function spawnBlood(x, y, n) {
for (var i = 0; i < n; i++) {
var tetra = Math.floor(Math.random() * 360) * (180 / Math.PI)
var speed = Math.floor(Math.random() * 4) + 3
particles.push({
x: x,
y: y,
vx: Math.cos(tetra) * speed,
vy: Math.sin(tetra) * speed,
r: 1.5,
angle: 0,
expireTimer: setTimeout(function(i) {
return function() {
particles[i] = null
for (var j = 0; j < particles.length; j++) {
if (particles[particles.length - 1] == null) {
particles.splice(particles.length - 1, 1)
}
}
}
}(i), Math.floor(Math.random() * 500) + 500),
})
}
}
У меня была похожая проблема при создании таймеров истечения срока действия для моей собственной звуковой функции в игре, но я обманул ошибки, заменив null новым Audio (""). Так как это связано с объектами, которые не работают, поэтому я задаюсь вопросом, может ли существовать подобный способ создания поддельных объектов, которые не возвращают ошибки, если они не имеют указанного значения. Пример:
Для объектов в этом случае это выдаст ошибку:
null.x * = трения <---- трения = 0,8, хотя, будет выдавать ошибку
Но он работает с поддельным новым аудио, когда речь идет об аудио:
new Audio (). play () <---- Не выдает ошибку
Есть ли способ сделать поддельный объект, который не возвращает ошибку, если он не имеет указанного значения, как в примере х? Или это неправильный путь, может быть, есть другое решение, которое не испортит Массив и Объекты?
Благодарю.
function spawnBlood(x, y, n) {
for (var i = 0; i < n; i++) {
var tetra = Math.floor(Math.random() * 360) * (180 / Math.PI)
var speed = Math.floor(Math.random() * 4) + 3
particles.push(new function() {
this.x = x
this.y = y
this.vx = Math.cos(tetra) * speed
this.vy = Math.sin(tetra) * speed
this.r = 1.5
this.angle = 0
this.expireTimer = setTimeout(function(self) {
return function() {
particles.splice(particles.indexOf(self), 1)
}
}(this), Math.floor(Math.random() * 500) + 500)
})
}
}
ОК, наконец-то!
@tewathia - Это хорошее решение или его можно улучшить, я имею в виду, что нет ли другого способа, кроме использования «новой функции ()» для создания объекта, который может получить свое собственное «это»?