Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   хотел как лучше, а получилось как всегда. Вопрос оптимизации (https://javascript.ru/forum/misc/34783-khotel-kak-luchshe-poluchilos-kak-vsegda-vopros-optimizacii.html)

9xakep 18.01.2013 23:33

хотел как лучше, а получилось как всегда. Вопрос оптимизации
 
игра:
У меня есть пушка, которая стреляет, вопрос о пулях:
Вначале у меня все работало так
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, так нормально работает.

Так вот господа, подскажите как все-таки лучше сделать-то?

Deff 18.01.2013 23:56

9xakep,
Походу не правильно имхо
Нун делать так
Цитата:

1. создал массив функций(Изначально пустой)
2. У setInterval запуск единственный в начале игры!
3. Интервал тупо перебирает массив функций и запускает.
4. Завершенная(и/или однократно-запускаемая) функция самоудаляет себя из массива запуска
http://javascript.ru/forum/events/34...tml#post227859

JsLoveR 19.01.2013 04:46

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();
		
		};

Посмотреть в действии тут, работает при клике мыши.

9xakep 19.01.2013 08:46

Deff,
Ок, так еще попробую сделать, тогда же лучше будет запинуть функцию: animate в прототип? Все же ей будут пользоваться

JsLoveR,
У меня там физика посложнее :)У меня на канвасе, есть башня, дуло которой крутиться, снаряд, который летит с ускорением, ипосле некоторого расстояния начинает тормозить, и когда его скорость становиться отрцательной - я удаляю его, и очищаю массив от него :)

Но все равно спасибо, у тебя идея вроде с deff похожа

dmitriymar 19.01.2013 10:21

снаряд -объект. обладающий свойствами -скорость, направление, координаты и т.д . Методами, возможно: проверка попадания, движение, удаление снаряда из массива, с экрана и т.д.
снаряды -массив объектов снаряд.
обработка -обход в единицу времени массива снаряды, запуск соответствующего метода объекта, какой по окончании работы запускает другие методы объекта.
т.е -отработал метод движение, запустил метод проверка попадания, запуск метода взрыв у объекта мишень (можно через интервал чтоб была реалистичность)
И у тебя получается примерно так:
изменение временного промежутка запуск метода приложения-сет интервал
метод знает какие объекты (массив объектов -тоже объект) ему проверить -запустить методы их ,
какие в свою очередь могут запустить, как сразу , так и отложено "связанные" методы, как свои , так и "связанных" объектов.

9xakep 19.01.2013 22:44

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 снаряда после чистки массива

9xakep 20.01.2013 12:53

Цитата:

Сообщение от Дзен-трансгуманист
UPD: Стоп, а че хэши, че я гоню? Просто обычный двусвязный список объектов, да и все. Попробовать можно, почему бы и нет?

Что это такое? В гугле поискал, только вопросы как его сделать.

9xakep 20.01.2013 13:57

Дзен-трансгуманист,
То бишь мы создаем объект, у которого есть методы add, delete, а в каждом ребенке есть свойства - которые ссылаются на следующего, и на предыдущего ребенка, если таковой имеется?

dmitriymar 20.01.2013 14:07

Цитата:

Сообщение от 9xakep
Кстати можно ли узнать id элемента в массиве

ты объект формируешь. ты создаёшь массив объектов. ты определяешь какая информация тебе нужна в объекте , какая нет

Deff 20.01.2013 14:07

Дзен-трансгуманист,
Парню 14 или 15


Часовой пояс GMT +3, время: 15:55.