Просмотр полной версии : Помогите в apply в requestAnimationFrame
Прочитал про .apply и интуитивно понимаю что мне его нужно использовать, но как - не понимаю.
...
animate: function () {
A = this
window.requestAnimationFrame(function () {
A.animate();
A.draw()
});
}
...
Эта функция - часть класса. Когда я создаю 1 объект этого класса - все хорошо, но когда я создаю 2 и более объекта, то функция работает исключительно с последним объектом - это логично, ведь она в каждом объекте переопределется. Но как мне сделать так, чтобы она не переопределялась, а просто каждый объект добавлял в нее свою функцию?
danik.js
06.12.2014, 17:47
Добавь в начало скрипта, в самый верх:
'use strict';
Теперь, если скрипт перестанет работать - значит где-то была допущена ошибка, которая раньше просто тебе прощалась.
Причем здесь это? поставил, но проблему это не выявило. Есть конкретная задача - добавить в requestAnimationFrame не одну функцию а несколько, с разных объектов, изнутри этих объектов.
т.е.
function G() {
window.requestAnimationFrame(function () {
testObj.draw()
testObj.draw()
testObj.draw()
G()
});
}
G()
работает нормально, но здесь я вне объектов объявил эту функцию. А я хочу чтобы она внутри каждого объекта вызывалась, непосредственно для этого объекта - и тут возникает проблема - функция переопределяется в каждом объекте... Мне кажется, что apply мог бы помочь, но не понимаю как его использовать ((
danik.js
06.12.2014, 18:39
поставил, но проблему это не выявило
Давай код полностью. Где у тебя объявлена A? Почему ты сначала показал один код, а щас - другой?
console.clear();
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = (function () {
return window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function (callback, element) {
window.setTimeout(callback, 16.7);
};
})();
}
var Elements = {
canvas: []
}
var Class = function () {
var _class = function (canvas_element) {
if (_class.init && typeof _class.init == "function") {
_class.init.apply(this, Array.prototype.slice.call(arguments));
}
};
_class.fn = _class.prototype;
_class.extend = function (prop) {
for (var i in prop) {
_class[i] = prop[i];
}
};
_class.include = function (prop) {
for (var i in prop) {
_class.fn[i] = prop[i];
}
};
return _class;
};
var T = 0;
var CanvasControl = new Class();
CanvasControl.extend({
init: function (canvas_element) {
this.canvas = canvas_element;
this.canvas.width = canvas_element.offsetWidth;
this.canvas.height = canvas_element.offsetHeight;
this.ctx = this.canvas.getContext("2d");
this.WIDTH = window.innerWidth;
this.HEIGHT = window.innerHeight;
this.canvas.onmousemove = this.myMove;
Elements.canvas.push(this)
this.EP = Elements.canvas.length-1
}
});
CanvasControl.include({
ClearStyle: function () {
this.ctx.strokeStyle = "rgba(0,0,0,1)";
this.ctx.fillStyle = "rgba(0,0,0,1)";
this.ctx.lineWidth = 1;
},
RECT: function (x, y, w, h) {
this.ctx.beginPath();
this.ctx.rect(x, y, w, h);
this.ctx.fill();
this.ctx.stroke();
},
DrawText: function (s, x, y) {
this.ctx.textBaseline = "middle";
this.ctx.textAlign = "center";
this.ctx.strokeText(s, x, y);
},
draw: function () {
this.RECT(0, 0, 100, 100);
},
myMove: function (e) {
//this.xMouse = e.pageX// - this.Cleft
//this.yMouse = e.pageY// - this.Ctop
console.log(this)
}
});
var can1 = new CanvasControl(document.getElementById("canvasA"));
function G() {
window.requestAnimationFrame(function () {
can1.draw()
G()
});
}
G()
Сейчас в конце, в функции G происходит вызов requestAnimationFrame, а до этого была функция animate внутри самого класса, которая пыталась вызывать requestAnimationFrame, но каждый следующий объект этого класса её перекрывал.
danik.js
06.12.2014, 19:33
а до этого была функция animate внутри самого класса
Вот верни ее на место. И добавь use strict.
danik.js
06.12.2014, 19:39
Siend, а че ты за поебень намутил. Какой-то непонятный Class. Внутри херня какая-то происходит. Какието extend'ы, include'ы.
Тебе че надо? Конструктор и набор методов? Ну тогда это так делается:
function CanvasControl() {
// код конструктора
}
CanvasControl.prototype = {
// тут методы
};
Все просто и понятно. Или у тебя задача - сделать так, чтоб хуй кто смог разобраться. Кста, ты уже вкурсе, что через некоторое время ты сам будешь смотреть на свой код как баран на новые ворота? Код почистую забывается, гарантирую.
И почитай какой-нибудь code style-guide. А то у тя хаос.
Конструкторы - с большой буквы. Инстансы, переменные, методы - с маленькой. Кэпслоком - константы.
Ну, это имитация класса, как в с# XD
danik.js
06.12.2014, 19:57
как в с#
А в моем примере тогда что? Или ты думаешь упомянул в коде слово Class, и твой код стал сразу заебатым? :D
не мой код, точно также помогли, потому что как самостоятельно это реализовать я не знал.
danik.js
06.12.2014, 20:15
не мой код, точно также помогли
Над тобой походу прикололись ))
>___< Помогите хотя бы с Event Handler разобраться Т_Т нихрена не понимаю как его заюзать, уже всю статью с этого сайта прочитал. http://javascript.ru/tutorial/events/intro Все равно не врубаюсь как в моем случае нужно действовать(
danik.js
06.12.2014, 20:28
Куда смотреть то?
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot