Я не мог понять, как работает ваш конструктор Text
. Поэтому я написал независимую функцию (не принадлежащую ни одному объекту). Все, что вам нужно передать этой функции, это строка, позиция X
и Y
, высота строки и отступы. Он предполагает, что холст будет присвоен переменной canvas
и 2d-контекст, назначенный переменной ctx
.
var canvas, ctx;
function typeOut(str, startX, startY, lineHeight, padding) {
var cursorX = startX || 0;
var cursorY = startY || 0;
var lineHeight = lineHeight || 32;
padding = padding || 10;
var i = 0;
$_inter = setInterval(function() {
var w = ctx.measureText(str.charAt(i)).width;
if(cursorX + w >= canvas.width - padding) {
cursorX = startX;
cursorY += lineHeight;
}
ctx.fillText(str.charAt(i), cursorX, cursorY);
i++;
cursorX += w;
if(i === str.length) {
clearInterval($_inter);
}
}, 75);
}
Посмотрите демо-версию here.
Советы -
Я шел через код и нашел что-то ссылка this-
function Rectangle(x,y,width,height,colour) {
//properties
this.draw = function() { //Don't assigns object methods through constructors
ctx.fillStyle = this.colour;
ctx.fillRect(this.x, this.y, this.width, this.height);
};
}
Вы не должны добавлять методы к объекту через конструктор, поскольку он создает метод каждый раз, когда объект создается. Скорее добавьте методы прототипу объекта, таким образом, они будут созданы только один раз и будут использоваться всеми экземплярами. Like-
function Rectangle(x,y,width,height,colour) {
//properties
}
Rectangle.prototype.draw = function() {
ctx.fillStyle = this.colour;
ctx.fillRect(this.x, this.y, this.width, this.height);
}
Кроме того, я обнаружил, что вы создаете дополнительные переменные, указывающие на некоторые объекты. Как -
var that = this;
var fadeIn = setInterval(function() {
//code
that.draw();
//code
}, time);
Вы не должны создавать дополнительные ссылки на Text
объекта. Используйте метод bind
, так что this
будет указывать на объект Text
. Like-
var fadeIn = setInterval(function() {
//code
this.draw(); // <-- Check this it is `this.draw` no need for `that.draw`
//code
}.bind(this), time); //bind the object
Подробнее о bind here.
Надеюсь, что это поможет.
PS: 75 миллисекунд для каждого персонажа, который будет святым 800 символов в минуту !!!
Update - Если вы хотите, масштабируемые графики вы должны рассмотреть SVG. Холст основан на растре, тогда как SVG основан на векторе. Это означает, что SVG можно легко изменить, тогда как при изменении размера холста содержимое холста начнет пикселизоваться и будет выглядеть нечетким. Read more.
Чтобы изменить размер содержимого холста, вам необходимо перекрасить весь холст. Всякий раз, когда что-то нарисовано на холсте, браузер рисует и забывает об этом. Поэтому, если вы хотите изменить размер/положение объекта, вам нужно полностью очистить полотно и перерисовать объект. В вашем случае вам нужно будет изменить ctx.font
в соответствии с размером холста, а затем обновить холст, что будет очень утомительной задачей.
+1 для _solution без плагинов! Стандартный JavaScript и HTML5 Canvas! _. Мне нравится это. Но ваш код плохо комментируется. Неясно, какие методы 'typeText' принимает и что такое' baseObjects' на самом деле. – ShuklaSannidhya
Не могли бы вы рассказать, как вы называете 'typeText', какие параметры вы передаете? – ShuklaSannidhya
'baseObjects' - это массив всех моих объектов на холсте (для целей перерисовки). 'typeText()' вызывается из объекта Text. Поэтому я бы сделал «var text = new Text();», затем вызывается 'text.typeText (baseObjects, 20);' – Jamesking56