хотел как лучше, а получилось как всегда. Вопрос оптимизации
игра:
У меня есть пушка, которая стреляет, вопрос о пулях: Вначале у меня все работало так function Shoot() { this.animate = function () { // физика снаряда, вообще все вычисления } this.anim = function () { setInterval(this.animate,50) } } // Вначале я создавал каждвую пулю по отдельности, выглядело это страшно: Shoot.prototype.i = 0 // Каждое создание пули - i++ // В Html это так: onclick=”eval(' //var shoot'+ //Shoot.prototype.i //+ '= (new Shoot()).anim())” То есть каждый снатяд жил сам по себе,теперь думаю: это же дофига интервалов и.т.д, дайка я все в один запихну var bullets = []; //html //onclick = bullets.push(new Shoot()) И потом каждый 50мс, скрипт синхронно для всех шариков делает все вычисления Только вот после синхронной реализации стало тормозить (массив я чистил, если снаряд "становился не нужным") Поэтому пришлось уменьшить интервал с 50 до 30, так нормально работает. Так вот господа, подскажите как все-таки лучше сделать-то? |
9xakep,
Походу не правильно имхо Нун делать так Цитата:
|
9xakep, как-то так:
.bullet{ width:10px; height:10px; background:#f00; position:absolute; } //массив объектов пуль var bulletObjs = []; function Bullet(x, y, vx, vy, gravity) { this.x = x; this.y = y; this.vx = vx; this.vy = vy; this.gravity = gravity; this.element = document.createElement("div"); this.element.className = "bullet"; this.update(); }; Bullet.prototype.move = function () { this.x += this.vx; this.y += this.vy; this.vy += this.gravity; this.update(); }; Bullet.prototype.update = function() { this.element.style.left = this.x + "px"; this.element.style.top = this.y + "px"; }; window.onload = function() { function game() { //основной интервал setInterval( function() { //при клике создаём объект - пуля window.onclick = function() { var bullet = new Bullet(50, 700, 5, -20, 0.5); //и добавляем её в общий массив пуль bulletObjs.push(bullet); document.body.appendChild(bullet.element); } //если произведён выстрел if(bulletObjs.length > 0) { //пробегаем по всем пулям for(var i = 0; i < bulletObjs.length; i++) { //и вызываем метод движения для каждой пули bulletObjs[i].move(); //если пуля залетела за пределы высоты экрана if(bulletObjs[i].y >= window.innerHeight){ //удаляем html - элемент с body document.body.removeChild(bulletObjs[i].element); // и из массива пуль bulletObjs.splice(i, 1); } } } }, 30); } game(); }; Посмотреть в действии тут, работает при клике мыши. |
Deff,
Ок, так еще попробую сделать, тогда же лучше будет запинуть функцию: animate в прототип? Все же ей будут пользоваться JsLoveR, У меня там физика посложнее :)У меня на канвасе, есть башня, дуло которой крутиться, снаряд, который летит с ускорением, ипосле некоторого расстояния начинает тормозить, и когда его скорость становиться отрцательной - я удаляю его, и очищаю массив от него :) Но все равно спасибо, у тебя идея вроде с deff похожа |
снаряд -объект. обладающий свойствами -скорость, направление, координаты и т.д . Методами, возможно: проверка попадания, движение, удаление снаряда из массива, с экрана и т.д.
снаряды -массив объектов снаряд. обработка -обход в единицу времени массива снаряды, запуск соответствующего метода объекта, какой по окончании работы запускает другие методы объекта. т.е -отработал метод движение, запустил метод проверка попадания, запуск метода взрыв у объекта мишень (можно через интервал чтоб была реалистичность) И у тебя получается примерно так: изменение временного промежутка запуск метода приложения-сет интервал метод знает какие объекты (массив объектов -тоже объект) ему проверить -запустить методы их , какие в свою очередь могут запустить, как сразу , так и отложено "связанные" методы, как свои , так и "связанных" объектов. |
dmitriymar,
короче вот что получилось: // onclick = 'bullets.push(new Shoot())' shoot_interval = setInterval(function () { for (k=0;k<bullets.length;k++) { bullets[k].animate(); } }, 50) // В Shoot есть: this.end = function () { // code... // Этот метод исполняется, когда шарик окончательно удаляется, в ней я полностью убираю шарик } ====== Хах) Сейчас все так красиво выглядит, когда писал, вся проблема удалить снаряд из массива без последствий... Что бы id шариков тоже сдвинулись. Кстати можно ли узнать id элемента в массиве? Что бы мне не приходилось уменьшать id снаряда после чистки массива |
Цитата:
|
Дзен-трансгуманист,
То бишь мы создаем объект, у которого есть методы add, delete, а в каждом ребенке есть свойства - которые ссылаются на следующего, и на предыдущего ребенка, если таковой имеется? |
Цитата:
|
Дзен-трансгуманист,
Парню 14 или 15 |
Часовой пояс GMT +3, время: 15:55. |