ООП. Летящие пули
Всем здравствуйте.
Задача состоит в следующем - при определенном событии - а нашем случае при клике на кнопку нужно создать элемент( к примеру пулю) и заставить ее двигаться - а при определенном условии (в нашем случае при пролете пули 1000 пикселей) удалить анимацию которая ее двигала и саму пулю (элемент) Все это я реализовал так http://1.top-start.ru/bullet/ Вот код скомпилированный с TypeScript: var Bullet = (function () { function Bullet() { this.element = document.getElementById('transline'); this.create(); } Bullet.prototype.create = function () { this.childElement = document.createElement("li"); this.element.appendChild(this.childElement); this.move(); }; Bullet.prototype.move = function () { var left = 0; var _this = this; var move = setInterval(function () { _this.childElement.style.left = (left += 4) + "px"; if (left > 1000) { clearInterval(move); _this.childElement.remove(); } }, 10); }; return Bullet; }()); var button2 = document.getElementById("create"); button2.addEventListener('click', function () { new Bullet(); }); То есть имеется класс описывающий пулю, а при клике создается объект который все реализовывает для каждой отдельной пули. Вопрос в следующем - правильный ли это подход? Если да то получается при каждом клике создается объект - при достижении условия удаляется анимация и элемент изображающий пулю но сам объект остается - надо ли его удалять и если да то как? Ведь этих объектов теоретически может быть десятки а то и сотни тысяч. Если мой подход неверный то как сделать что бы можно было создать один объект и что бы он управлял всеми пулями В нашем случае это должно работать var bullet = new Bullet(); var button2 = document.getElementById("create"); button2.addEventListener('click', function() { bullet.create(); }); Изначально так и думал сделать - но не получилось - там проблемы с setInterval возникает и все криво работает. Буду признателен за помощь. |
Bond,
Ты пишешь надо ли удалять объект... как удалить объект в этом языке? |
Rise, так и есть, поразбирался, погуглил, в коде поставил создание 10 объектов через каждые 100 мс за один клик - запустил в отладчике посмотрел - вроде все гуд, память очищается почти сразу же.
Coriolan161, ну может не сам объект а ссылки на него через delete. А вообще имел ввиду стоит ли в моей ситуации заботиться о памяти и т.д |
Bond, move вынести наружу и забиндить, иначе он каждый раз заново создаётся, что не есть хорошо.
var Bullet = (function() { function Bullet() { this.element = document.getElementById('transline'); this.bullet = document.createElement('li'); this.left = 0; this._move = this.move.bind(this); } Bullet.prototype.create = function() { setTimeout(this._move, 10); }; Bullet.prototype.move = function() { this.left += 4; this.bullet.style.left = this.left + 'px'; if(this.left >= 1000) this.remove(); else setTimeout(this._move, 10); }; Bullet.prototype.remove = function() { this.bullet.remove(); this.left = 0; }; return Bullet; }()); Также советую почитать про requestAnimationFrame. |
Rise,
спасибо за код, только не совсем понял как это работает. Понял что это рекурсивный setTimeout, но как он потом убивается - при удалении элемента? И не будет ли проблем если мне нужно будет не удалить элемент пулю, а остановить? Ruslan_xDD, спасибо почитаю про requestAnimationFrame. Вернее уже почитал разобраться надо. |
Bond, думаю, вот так лучше будет:
var Bullet = (function() { function Bullet() { this.element = document.getElementById('transline'); this.bullet = document.createElement('li'); this.left = 0; this._play = this.play.bind(this); this.element.appendChild(this.bullet); } Bullet.prototype.play = function() { this.left += 4; this.bullet.style.left = this.left + 'px'; if(this.left >= 1000) { this.remove(); } else { this._timeoutID = setTimeout(this._play, 10); } }; Bullet.prototype.remove = function() { this.stop(); this.bullet.remove(); }; Bullet.prototype.restart = function() { this.stop(); this.play(); }, Bullet.prototype.stop = function() { this.left = 0; clearTimeout(this._timeoutID); }; return Bullet; }()); var bullet = new Bullet; bullet.play(); |
Bond, да обычный setTimeout почитай как он работает, ещё вариант:
<body> <style> @keyframes move { 100% { left: 500px; background: #777; } } .parent, .bullet { position: absolute; top: 0; left: 0; padding: 10px; margin: 30px; border-radius: 50%; background: #eee; list-style: none; cursor: pointer; } .bullet { animation: move 2s linear 2 alternate; } .bullet:hover { animation-play-state: paused; } </style> <script> var Bullet = (function() { function Bullet() { var parent = document.createElement('ul'); parent.classList.add('parent'); parent.textContent = 'Click'; parent.addEventListener('click', this.create.bind(this)); parent.addEventListener('animationend', this.remove.bind(this)); var bullet = document.createElement('li'); bullet.classList.add('bullet'); bullet.textContent = 'Bullet'; this.parent = document.body.appendChild(parent); this.bullet = bullet; } Bullet.prototype.create = function() { var bullet = this.parent.appendChild(this.bullet.cloneNode(true)); }; Bullet.prototype.remove = function(event) { var bullet = this.parent.removeChild(event.target); }; return Bullet; }()); var bullet = new Bullet(); </script> </body> |
Rise,
спасибо, посмотрю что лучше Мне там еще нужно предусмотреть возможность расширения. К примеру надо будет считывать положение относительно других движущихся объектов в зависимости от положения делать определенные действия. то ли шар сам свое положение будет считать, то ли это будет отдельный класс хз. Да и сами шары будут летать не по одной и той же траектории. Вообще суть такая - сверху экрана будут ползти жуки, а эти шары будут их сбивать. Жуков я запилил, для них рандомно задается оступ слева и они ползут вниз, также запилил пушку шары которой мы здесь делали - пушка передвигается внизу экрана за курсором и стреляет кликом. Пока что эти шары сделал по своему коду, потом может ваш вариант поставлю. Но это уже другая история - завтра, когда залью свой код на сервер напишу вопрос как высчитывать положения жуков и шаров и если их положения совпадают то удалять шар и жука или еще что-то с ними делать. |
Часовой пояс GMT +3, время: 20:18. |