Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.12.2014, 14:15
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

Не могу найти ошибку. Класс для Canvas
Создал собственный класс для элемента Canvas, но не работает, а ошибку найти не могу.

<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css">
<script src="jquery.js" type="text/javascript"></script>
<title>Canvas Drag and Drop Test</title>
</head>
<body id="menu">
<canvas id="canvas"></canvas>

</body>

    <script>

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 Class = 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;

            var _class = function () { }; 
            _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 myClass = new Class(document.getElementById("canvas"));

        myClass.extend({
            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, this.canvas.width, this.canvas.height)
                
            },
            animate: function () {
                requestAnimationFrame(this.animate);
                this.draw()
            }
        });

</script>
</html>


Что в нем не так?

Последний раз редактировалось Siend, 04.12.2014 в 14:21.
Ответить с цитированием
  #2 (permalink)  
Старый 04.12.2014, 14:56
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

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;

Зачем это, если ты дальше возвращаешь какую-то непонятную функцию _class? В результате всех этих свойств у нее не будет. Да и вообще как должно это работать то? И зачем засовывать скрипт после закрывающего тега body?
Ответить с цитированием
  #3 (permalink)  
Старый 04.12.2014, 15:00
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

делал основываясь на этом уроке:

console.clear();
// не вижу смысла объяснять ВСЕ про ООП в JS (к тому же сам знаю не все:D)
 
 
// Если использовать функцию с оператором new, то она возвращает объект
function createObject(name) {
    this.name = name || "default"; // тут this ссылается на будущий объект
}
var o1 = new createObject("object1"); // получим объект со свойством name == object1

// Следующий уровень
var Class = function () {
  var _class = function () {}; // обертка для нашего будующего класса
  _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 myClass = new Class(); // создали класс, теперь добавить свойств к экземплярам класса

// У всех экземпляров будет свойство parent ( класс который создал экземпляр, просто строка, а не сссылка)
myClass.include({
  class : "parent",
  greet : function () { alert("hello, world"); }
});

// Расширим сам класс
myClass.extend({
   someFunc : function () { alert("This is function of class"); } // "бездушная" функция
});

// Попробуем создать класс и проверить его свойства
var example = new myClass();
console.log(example); // все свойства, который мы указали в include есть!

// так же работают свойства самого класса
console.log(myClass.someFunc); // просто выведем, не будем вызывать

// теперь можно плодить кучу объектов, с помощью нашего класса, при этом создавать новые классы, при этом расширять и делать каждый неповторимым

var objects = [];
for(var i = 0; i < 4; i++) {
   objects[i] = new myClass();
}

console.log(objects);


// Урок окончен, если что, потом могу рассказать как добавить настраиваемые экземпляры + наследование классов и прочие фишки из оригинального ООП



// Ссылка на сам класс находится в this;
myClass.extend({
  showGreet : function () {
     // функция обращается к другой функции, которая уже является свойством класса, через this
     console.log(this.someFunc);
  }
});

// Теперь используем нашу функцию
myClass.showGreet(); // показывает нам функцию этого же класса

// Навешаем обработчик
var span = document.getElementById("sp");
span.onclick = (function () {
  return function () {
    alert(this.tagName);
  }.bind(span);
})();
Ответить с цитированием
  #4 (permalink)  
Старый 04.12.2014, 15:04
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 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 Class = function () {

            var _class = function () { }; 
            _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 myClass = new Class();

        myClass.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.animate()
            },
            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)
                
            },
            animate: function () {
                console.log("was here 1")
                requestAnimationFrame(this.animate);
                this.draw()
            }
        });

        myClass.init(document.getElementById("canvas"))


браузер ругается и выдает:
Uncaught TypeError: Failed to execute 'requestAnimationFrame' on 'Window': The callback provided as parameter 1 is not a function.testClass.html:83 myClass.extend.animate
Ответить с цитированием
  #5 (permalink)  
Старый 04.12.2014, 15:06
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

Все исправил, ошибка была тут:
requestAnimationFrame(this.animate);

нужно просто
requestAnimationFrame(this);
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите, пжлста, найти (или написать) скрипт для смены картинок. Artweb Работа 9 25.02.2011 11:28
прошу помочь найти ошибку в самодельном drag&drop versoul Элементы интерфейса 1 03.03.2010 01:59
Аналог wmode=transparent для Canvas или svg lusever Events/DOM/Window 1 15.06.2009 16:05
не могу совладать со звуками для Onmouseover и Onmouseclick THER1ON Серверные языки и технологии 7 27.05.2009 21:03
Как найти путь к файлу для модификации? JuliaMilan Firefox/Mozilla 0 31.03.2009 14:06