使用ローカル空間
代わりに、あなたは彼らがそのローカル空間に独自の原点を中心にすべてのものを描きたい位置にオブジェクトを描画します。原点は(0,0)にあり、オブジェクトが回転する場所です。
あなたは、それがその起源で描画されるように
function drawRect(){
context.fillRect(-50,-50 , 100, 100);
}
function drawRect(){
context.fillRect(200, 40, 100, 100);
}
変化に描く四角形を持っている場合は、
をしたいwhereveryだから今、あなたは簡単にそれを描くことができます
既存のトランスフォームをクリアするsetTransform関数から始めて、オブジェクトの中心の位置を設定する便利な方法は
0123です
ctx.setTransform(1,0,0,1,posX,posY); // clear transform and set center location
あなたはそれを回転させたい場合は、あなたが回転する前に拡張すべき二つの異なるスケールを持っているならば、
ctx.scale(scale,scale);
と
ctx.rotate(ang);
とスケール回転を追加します。
は今だけ
drawRect();
描画関数を呼び出し、それがPOSXを中心に描かれている、POSYが回転し、スケール。
x、yの位置、幅と高さ、位取りと回転を持つ関数にすべてを組み合わせることができます。あなたは上の2000のスプライトを描画することができます6歳のラップトップで
function drawImage(img,x,y,w,h,scale,rotation,alpha){
ctx.globalAlpha = alpha;
ctx.setTransform(scale,0,0,scale,x,y);
ctx.rotate(rotation);
ctx.drawImage(img,-img.width/2,-img.height/2,img.width,img.height);
}
をまた、スプライトとして画像に適用され、私はアルファが含まれるのsetTransformに
function drawRect(x,y,w,h,scale,rotation){
ctx.setTransform(scale,0,0,scale,x,y);
ctx.rotate(rotation);
ctx.strokeRect(-w/2,-h/2,w,h);
}
をスケールを含むことができ、ファイアフォックスは1/60th毎秒、回転、拡大縮小、配置、アルファフェードで再生されます。
前後の翻訳を混乱させる必要はありません。あなたが描いているすべてのオブジェクトを元のものに保ち、その起源を変換を介して移動してください。
更新 ここでデモを失ったので、実際にどのように行うかを示します。
多くの回転、拡大縮小された翻訳、アルファ付きの長方形を描画します。あなたは、その中心の周りの形状の点のすべてを回転させる回転機能を使用し
// create canvas and add resize
var canvas,ctx;
function createCanvas(){
canvas = document.createElement("canvas");
canvas.style.position = "absolute";
canvas.style.left = "0px";
canvas.style.top = "0px";
canvas.style.zIndex = 1000;
document.body.appendChild(canvas);
}
function resizeCanvas(){
if(canvas === undefined){
createCanvas();
}
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
ctx = canvas.getContext("2d");
}
resizeCanvas();
window.addEventListener("resize",resizeCanvas);
// simple function to draw a rectangle
var drawRect = function(x,y,w,h,scale,rot,alpha,col){
ctx.setTransform(scale,0,0,scale,x,y);
ctx.rotate(rot);
ctx.globalAlpha = alpha;
ctx.strokeStyle = col;
ctx.strokeRect(-w/2,-h/2, w, h);
}
// create some rectangles in unit scale so that they can be scaled to fit
// what ever screen size this is in
var rects = [];
for(var i = 0; i < 200; i ++){
rects[i] = {
x : Math.random(),
y : Math.random(),
w : Math.random() * 0.1,
h : Math.random() * 0.1,
scale : 1,
rotate : 0,
dr : (Math.random() - 0.5)*0.1, // rotation rate
ds : Math.random()*0.01, // scale vary rate
da : Math.random()*0.01, // alpha vary rate
col : "hsl("+Math.floor(Math.random()*360)+",100%,50%)",
};
}
// draw everything once a frame
function update(time){
var w,h;
w = canvas.width; // get canvas size incase there has been a resize
h = canvas.height;
ctx.setTransform(1,0,0,1,0,0); // reset transform
ctx.clearRect(0,0,w,h); // clear the canvas
// update and draw each rect
for(var i = 0; i < rects.length; i ++){
var rec = rects[i];
rec.rotate += rec.dr;
drawRect(rec.x * w, rec.y * h, rec.w * w,rec.h * h,rec.scale + Math.sin(time * rec.ds) * 0.4,rec.rotate,Math.sin(time * rec.da) *0.5 + 0.5,rec.col);
}
requestAnimationFrame(update); // do it all again
}
requestAnimationFrame(update);
ただし、2番目の回転は最初のオブジェクトに影響しますか?それは私が望むものではありません。 – katie
の前に描画されたオブジェクトにのみ影響を与えるように、それぞれ回転したいと思います。それらの後に起こることに変換が適用されます。したがって、rotateを呼び出した後にfillRectを呼び出すと、それは適用される回転の前になります。 2番目のオブジェクトに対して異なる量だけ回転させたい場合は、呼び出す前に別の回転値を使用してください。 – CrazyCasta