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