18.01.2013, 23:33
|
|
сегодня в 12:34|Комментир
|
|
Регистрация: 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, так нормально работает.
Так вот господа, подскажите как все-таки лучше сделать-то?
__________________
оляля, ололо
|
|
18.01.2013, 23:56
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
9xakep,
Походу не правильно имхо
Нун делать так
Цитата:
|
1. создал массив функций(Изначально пустой)
2. У setInterval запуск единственный в начале игры!
3. Интервал тупо перебирает массив функций и запускает.
4. Завершенная(и/или однократно-запускаемая) функция самоудаляет себя из массива запуска
|
Синхронизировать события по setInterval
Последний раз редактировалось Deff, 19.01.2013 в 01:43.
|
|
19.01.2013, 04:46
|
Любитель
|
|
Регистрация: 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 в 04:56.
|
|
19.01.2013, 08:46
|
|
сегодня в 12:34|Комментир
|
|
Регистрация: 12.04.2011
Сообщений: 1,180
|
|
Deff,
Ок, так еще попробую сделать, тогда же лучше будет запинуть функцию: animate в прототип? Все же ей будут пользоваться
JsLoveR,
У меня там физика посложнее У меня на канвасе, есть башня, дуло которой крутиться, снаряд, который летит с ускорением, ипосле некоторого расстояния начинает тормозить, и когда его скорость становиться отрцательной - я удаляю его, и очищаю массив от него
Но все равно спасибо, у тебя идея вроде с deff похожа
__________________
оляля, ололо
|
|
19.01.2013, 10:21
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
снаряд -объект. обладающий свойствами -скорость, направление, координаты и т.д . Методами, возможно: проверка попадания, движение, удаление снаряда из массива, с экрана и т.д.
снаряды -массив объектов снаряд.
обработка -обход в единицу времени массива снаряды, запуск соответствующего метода объекта, какой по окончании работы запускает другие методы объекта.
т.е -отработал метод движение, запустил метод проверка попадания, запуск метода взрыв у объекта мишень (можно через интервал чтоб была реалистичность)
И у тебя получается примерно так:
изменение временного промежутка запуск метода приложения-сет интервал
метод знает какие объекты (массив объектов -тоже объект) ему проверить -запустить методы их ,
какие в свою очередь могут запустить, как сразу , так и отложено "связанные" методы, как свои , так и "связанных" объектов.
Последний раз редактировалось dmitriymar, 19.01.2013 в 14:40.
|
|
19.01.2013, 22:44
|
|
сегодня в 12:34|Комментир
|
|
Регистрация: 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 в 22:56.
|
|
20.01.2013, 12:53
|
|
сегодня в 12:34|Комментир
|
|
Регистрация: 12.04.2011
Сообщений: 1,180
|
|
Сообщение от Дзен-трансгуманист
|
UPD: Стоп, а че хэши, че я гоню? Просто обычный двусвязный список объектов, да и все. Попробовать можно, почему бы и нет?
|
Что это такое? В гугле поискал, только вопросы как его сделать.
__________________
оляля, ололо
|
|
20.01.2013, 13:57
|
|
сегодня в 12:34|Комментир
|
|
Регистрация: 12.04.2011
Сообщений: 1,180
|
|
Дзен-трансгуманист,
То бишь мы создаем объект, у которого есть методы add, delete, а в каждом ребенке есть свойства - которые ссылаются на следующего, и на предыдущего ребенка, если таковой имеется?
__________________
оляля, ололо
|
|
20.01.2013, 14:07
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от 9xakep
|
Кстати можно ли узнать id элемента в массиве
|
ты объект формируешь. ты создаёшь массив объектов. ты определяешь какая информация тебе нужна в объекте , какая нет
|
|
20.01.2013, 14:07
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Дзен-трансгуманист,
Парню 14 или 15
|
|
|
|