#javascript #html #css #arrays
#javascript #HTML #css #массивы
Вопрос:
Итак, я создаю игру, в которой движется космический корабль, и он должен избегать изображения огненного шара, чтобы выиграть. Моя проблема в том, что у меня снова и снова повторяется только один огненный шар. Вместо этого я хотел бы иметь много огненных шаров, которые умножаются с течением времени. Я думаю, мне нужно включить массив и использовать метод push (), но я попытался, и это не сработало. Если бы кто-нибудь мог мне помочь, я был бы очень признателен. Спасибо
//Fireball script
function fireballScript(offset) {
return Math.floor(Math.random() * (window.innerWidth - offset))
}
let fireballMovement = {
x: fireballScript(fireball.offsetWidth),
y: 0
}
const fireLoop = function () {
fireballMovement.y = 1
fireball.style.top = fireballMovement.y 'px'
if (fireballMovement.y > window.innerHeight) {
fireballMovement.x = fireballScript(fireball.offsetWidth)
fireball.style.left = fireballMovement.x 'px'
fireballMovement.y = 0
fireball.setAttribute('hit', false)
}
}
fireball.style.left = fireballMovement.x 'px'
let fireballSpeed = setInterval(fireLoop, 1000 / 250)
let fireball = document.querySelector("#fireball")
<img src = "Photo/fireball.png" id = "fireball" >
//Stop game on collision
function checkCollision() {
if (detectOverlap(spaceship, fireball) amp;amp; fireball.getAttribute('hit') == 'false') {
hits
fireball.setAttribute('hit', true)
alert("lost")
}
setTimeout(checkCollision, 1)
}
var detectOverlap = (function () {
function getPositions(spaceship) {
var pos = spaceship.getBoundingClientRect()
return [[pos.left, pos.right], [pos.top, pos.bottom]]
}
function comparePositions(p1, p2) {
let r1 = p1[0] < p2[0] ? p1 : p2
let r2 = p1[0] < p2[0] ? p2 : p1
return r1[1] > r2[0] || r1[0] === r2[0]
}
return function (a, b) {
var pos1 = getPositions(a),
pos2 = getPositions(b)
return comparePositions(pos1[0], pos2[0]) amp;amp; comparePositions(pos1[1], pos2[1])
}
})()
let spaceship = document.querySelector("#icon")
<img src = "Photo/Spaceship1.png" id="icon">
PS: Я задавал этот вопрос дюжину раз, но я никогда не мог получить ответ, который был бы включен в мой код. Было бы очень полезно, если бы кто-нибудь мог это исправить … еще раз спасибо
Комментарии:
1. Если чего-то не хватает (например, вы говорите, что мой код неполон, не стесняйтесь просить меня опубликовать больше кода). В любом случае, я думаю, что опубликовал то, что подходит для ответа на вопрос…
Ответ №1:
У вас должен быть массив огненных шаров
var fireballs = [];
Создайте конструктор для fireballs вместо того, чтобы помещать их непосредственно в html
function fireball(x, y) {
movementX = x;
movementY = y;
}
Затем вставьте новые изображения в массив с динамическими значениями положения. Чтобы добавить их в документ, вам нужно добавить их к родительскому элементу. Если <body>
это родительский элемент, вы бы сделали это:
let f = new fireball(10, 20)
fireballs.push(f)
document.body.appendChild(f)
В вашем обновлении выполните итерацию по файерболам и обновите их движение.
fireballs.forEach((fireball) => {
// update position for each fireball
});
Комментарии:
1. Это очень любезно, Дэн Маллин, но возможно ли включить это в мой код? Большое спасибо. (если вам нужен весь код, просто спросите)
2. К сожалению, код требует некоторого серьезного рефакторинга для поддержки нескольких файерболов. Я сталкивался с этой проблемой несколько раз в первых нескольких играх, которые я создал. Основная идея состоит в том, чтобы использовать весь код, который вы написали для перемещения одного огненного шара в
forEach()
функцию. Вы делаете одно и то же для каждого огненного шара, так что вы можете практически просто скопировать / вставить имеющийся у вас код в эту функцию. Создайте функцию перемещения для обработки перемещения, затем просто вызывайте свои функции последовательно. Переместить, проверить коллизию и т.д.3. @Thomas — Dan предоставил здесь очень хороший ответ. Вам нужно уйти и попрактиковаться в использовании массивов и групп объектов. Если Дэн напишет весь код за вас, то вы ничему не научитесь, и вы не напишете игру, а Дэн напишет.
4. Ли Тейлор, ты прав, я не многому научусь, если буду только копировать и вставлять, но я не закончу игру вовремя, если буду делать это в одиночку… итак, мое единственное решение — скопировать и вставить хороший ответ, чтобы завершить игру… надеюсь, вы понимаете.