Text
コンストラクターがどのように機能するか理解できませんでした。そこで、私は独立した関数を作成しました(どのオブジェクトにも属していません)。この関数に渡す必要があるのは、文字列、X
andの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);
}
こちらのデモをご覧ください。
ヒント-
私はあなたのコードを調べていて、これにリンクしているものを見つけました-
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);
};
}
オブジェクトがインスタンス化されるたびにメソッドが作成されるため、コンストラクターを介してオブジェクトにメソッドを追加しないでください。オブジェクトのプロトタイプにメソッドを追加するのではなく、この方法で、メソッドは1回だけ作成され、すべてのインスタンスで共有されます。好き-
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
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
バインドについて詳しくは、こちらをご覧ください。
お役に立てば幸いです。
PS:各文字で75ミリ秒、それは毎分800文字になります!!!
更新-スケーラブルグラフィックスが必要な場合は、SVGを検討する必要があります。Canvasはラスターベースですが、SVGはベクターベースです。つまり、SVGは簡単にサイズ変更できますが、キャンバスのサイズを変更すると、キャンバスのコンテンツがピクセル化されてぼやけて見えます。続きを読む。
キャンバスのコンテンツのサイズを変更するには、キャンバス全体を再描画する必要があります。キャンバスに何かが描かれると、ブラウザはそれを描き忘れてしまいます。したがって、オブジェクトのサイズ/位置を変更する場合は、キャンバスを完全にクリアして、オブジェクトを再描画する必要があります。あなたの場合、ctx.font
キャンバスのサイズに応じて変更してから、キャンバスを更新する必要があります。これは非常に面倒な作業になります。