Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.01.2013, 22:33
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

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

Так вот господа, подскажите как все-таки лучше сделать-то?
__________________
оляля, ололо
Ответить с цитированием
  #2 (permalink)  
Старый 18.01.2013, 22:56
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

9xakep,
Походу не правильно имхо
Нун делать так
Цитата:
1. создал массив функций(Изначально пустой)
2. У setInterval запуск единственный в начале игры!
3. Интервал тупо перебирает массив функций и запускает.
4. Завершенная(и/или однократно-запускаемая) функция самоудаляет себя из массива запуска
Синхронизировать события по setInterval

Последний раз редактировалось Deff, 19.01.2013 в 00:43.
Ответить с цитированием
  #3 (permalink)  
Старый 19.01.2013, 03:46
Любитель
Отправить личное сообщение для JsLoveR Посмотреть профиль Найти все сообщения от JsLoveR
 
Регистрация: 16.12.2009
Сообщений: 422

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

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

Последний раз редактировалось JsLoveR, 19.01.2013 в 03:56.
Ответить с цитированием
  #4 (permalink)  
Старый 19.01.2013, 07:46
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

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

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

Но все равно спасибо, у тебя идея вроде с deff похожа
__________________
оляля, ололо
Ответить с цитированием
  #5 (permalink)  
Старый 19.01.2013, 09:21
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

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

Последний раз редактировалось dmitriymar, 19.01.2013 в 13:40.
Ответить с цитированием
  #6 (permalink)  
Старый 19.01.2013, 21:44
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

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, 19.01.2013 в 21:56.
Ответить с цитированием
  #7 (permalink)  
Старый 20.01.2013, 11:53
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

Сообщение от Дзен-трансгуманист
UPD: Стоп, а че хэши, че я гоню? Просто обычный двусвязный список объектов, да и все. Попробовать можно, почему бы и нет?
Что это такое? В гугле поискал, только вопросы как его сделать.
__________________
оляля, ололо
Ответить с цитированием
  #8 (permalink)  
Старый 20.01.2013, 12:57
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

Дзен-трансгуманист,
То бишь мы создаем объект, у которого есть методы add, delete, а в каждом ребенке есть свойства - которые ссылаются на следующего, и на предыдущего ребенка, если таковой имеется?
__________________
оляля, ололо
Ответить с цитированием
  #9 (permalink)  
Старый 20.01.2013, 13:07
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от 9xakep
Кстати можно ли узнать id элемента в массиве
ты объект формируешь. ты создаёшь массив объектов. ты определяешь какая информация тебе нужна в объекте , какая нет
Ответить с цитированием
  #10 (permalink)  
Старый 20.01.2013, 13:07
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Дзен-трансгуманист,
Парню 14 или 15
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как лучше написать скрипт теста Dimaz jQuery 2 28.11.2012 15:08
30(1|2) редирект от сервера. Или как лучше сделать редирект при верной отсылке форма. pizzZ AJAX и COMET 2 18.02.2010 09:06
Вопрос как сделать эту панельку Определённых размеров и свойств. jei jQuery 3 09.06.2009 19:14