06.12.2014, 17:05
|
Профессор
|
|
Регистрация: 04.02.2012
Сообщений: 196
|
|
Помогите в apply в requestAnimationFrame
Прочитал про .apply и интуитивно понимаю что мне его нужно использовать, но как - не понимаю.
...
animate: function () {
A = this
window.requestAnimationFrame(function () {
A.animate();
A.draw()
});
}
...
Эта функция - часть класса. Когда я создаю 1 объект этого класса - все хорошо, но когда я создаю 2 и более объекта, то функция работает исключительно с последним объектом - это логично, ведь она в каждом объекте переопределется. Но как мне сделать так, чтобы она не переопределялась, а просто каждый объект добавлял в нее свою функцию?
|
|
06.12.2014, 17:47
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Добавь в начало скрипта, в самый верх:
'use strict';
Теперь, если скрипт перестанет работать - значит где-то была допущена ошибка, которая раньше просто тебе прощалась.
__________________
В личку только с интересными предложениями
|
|
06.12.2014, 17:56
|
Профессор
|
|
Регистрация: 04.02.2012
Сообщений: 196
|
|
Причем здесь это? поставил, но проблему это не выявило. Есть конкретная задача - добавить в requestAnimationFrame не одну функцию а несколько, с разных объектов, изнутри этих объектов.
т.е.
function G() {
window.requestAnimationFrame(function () {
testObj.draw()
testObj.draw()
testObj.draw()
G()
});
}
G()
работает нормально, но здесь я вне объектов объявил эту функцию. А я хочу чтобы она внутри каждого объекта вызывалась, непосредственно для этого объекта - и тут возникает проблема - функция переопределяется в каждом объекте... Мне кажется, что apply мог бы помочь, но не понимаю как его использовать ((
|
|
06.12.2014, 18:39
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Siend
|
поставил, но проблему это не выявило
|
Давай код полностью. Где у тебя объявлена A? Почему ты сначала показал один код, а щас - другой?
__________________
В личку только с интересными предложениями
|
|
06.12.2014, 19:29
|
Профессор
|
|
Регистрация: 04.02.2012
Сообщений: 196
|
|
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, но каждый следующий объект этого класса её перекрывал.
|
|
06.12.2014, 19:33
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Siend
|
а до этого была функция animate внутри самого класса
|
Вот верни ее на место. И добавь use strict.
__________________
В личку только с интересными предложениями
|
|
06.12.2014, 19:39
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Siend, а че ты за поебень намутил. Какой-то непонятный Class. Внутри херня какая-то происходит. Какието extend'ы, include'ы.
Тебе че надо? Конструктор и набор методов? Ну тогда это так делается:
function CanvasControl() {
// код конструктора
}
CanvasControl.prototype = {
// тут методы
};
Все просто и понятно. Или у тебя задача - сделать так, чтоб хуй кто смог разобраться. Кста, ты уже вкурсе, что через некоторое время ты сам будешь смотреть на свой код как баран на новые ворота? Код почистую забывается, гарантирую.
И почитай какой-нибудь code style-guide. А то у тя хаос.
Конструкторы - с большой буквы. Инстансы, переменные, методы - с маленькой. Кэпслоком - константы.
__________________
В личку только с интересными предложениями
|
|
06.12.2014, 19:51
|
Профессор
|
|
Регистрация: 04.02.2012
Сообщений: 196
|
|
Ну, это имитация класса, как в с# XD
|
|
06.12.2014, 19:57
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Siend
|
как в с#
|
А в моем примере тогда что? Или ты думаешь упомянул в коде слово Class, и твой код стал сразу заебатым?
__________________
В личку только с интересными предложениями
|
|
06.12.2014, 20:10
|
Профессор
|
|
Регистрация: 04.02.2012
Сообщений: 196
|
|
не мой код, точно также помогли, потому что как самостоятельно это реализовать я не знал.
|
|
|
|