2017-01-20 1 views
0

Я пытаюсь получить ручку поворота в холсте, и я не нашел ответа на вопрос.HTML 5 Холст. Как вращать (удерживать вращение) только один объект (из> 1)?

Один квадрат должен оставаться неподвижным. Другой квадрат для поворота в заданной точке. Я могу либо заставить весь холст вращаться в этой точке, либо ни в коем случае. Но я не могу заставить один квадрат быть статичным, а другой - вращаться.

Пожалуйста, просмотрите мое codepen демо здесь: http://codepen.io/richardk70/pen/EZWMXx

В JavaScript:

HEIGHT = 400; 
WIDTH = 400; 

function draw(){ 

var ctx = document.getElementById("canvas").getContext('2d'); 
ctx.clearRect(0,0,WIDTH,HEIGHT); 

// draw black square 
ctx.save(); 
ctx.fillStyle = "black"; 
ctx.beginPath(); 
ctx.fillRect(75,75,100,100); 
ctx.closePath(); 
ctx.restore(); 

// attempt to rotate small, maroon square only 
ctx.save(); 
ctx.translate(225,225); 

// small maroon square 
ctx.fillStyle = "maroon"; 
ctx.beginPath(); 
ctx.fillRect(-25,-25,50,50); 
ctx.closePath(); 
ctx.rotate(.1); 
ctx.translate(-225,-225); 

// comment out below line to spin 
// ctx.restore(); 

window.requestAnimationFrame(draw); 
} 

window.requestAnimationFrame(draw); 

Я знаю, что я мог сделать слоистые холсты, но, конечно, это может быть сделано только в одном слое холста? Разве часы в этом уроке (https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Basic_animations) не делают именно это?

Спасибо за любую помощь.

+0

Если посмотреть на примере Вы связываетесь, он регулирует количество вращения в зависимости от текущего времени, так что каждый вызов отрисовки немного смещает планеты. Вы пытаетесь скопировать ротацию в контексте, и это не так, как это работает. – DrC

ответ

0

Чтобы повернуть только одно изображение или рендеринг, вам необходимо восстановить состояние преобразования холста обратно по умолчанию.

Эта функция сделает ваш объект повернутым масштабированным и переведенным, но не повлияет на любой другой рендеринг.

BTW вам не нужно использовать beginPath это делают вызовы начинаются с заливки или обводки, такие как ctx.fillRect, ctx.strokeRect, ctx.fillText, ctx.strokeText и вам нужно только использовать ctx.closePath, если вам нужно, чтобы создать линию из последней точки пути к предыдущему ctx.moveTo точка или первая точка пути после ctx.beginPath звонок

Также вам не нужно использовать сохранение и восстановление для всего рендеринга. Вы используете его только в том случае, если вам нужно вернуть прежнее состояние холста.

ctx = canvas.getContext("2d"); 
 

 
function drawBox(col,size,x,y,scale,rot){ 
 
    ctx.fillStyle = col; 
 
    // use setTransform as it overwrites the canvas transform rather than multiply it as the other transform functions do 
 
    ctx.setTransform(scale, 0, 0, scale, x, y); 
 
    ctx.rotate(rot); 
 
    ctx.fillRect(-size/2,-size/2, size, size); 
 
} 
 

 

 
function update(time){ 
 
    ctx.clearRect(0,0,512,256) 
 
    drawBox("black",100,125,125,1,0); // draw none rotated box 
 
    drawBox("maroon",50,225,125,1,time/500); // draw rotating box 
 
    drawBox("green",25,275,100,1,-time/250); // draw rotating box 
 
    drawBox("green",25,275,150,1,-time/250); // draw rotating box 
 
    // after using transforms you need to reset the transform to the default 
 
    // if you plan to render anything in the default coordinate system 
 
    ctx.setTransform(1, 0 ,0 , 1, 0, 0); // reset to default transform 
 

 
    requestAnimationFrame(update); 
 
} 
 

 
requestAnimationFrame(update);
<canvas id="canvas" width="512" height="256"></canvas>

+0

Blindman, я знаю, что я не должен сказать «спасибо», но я собираюсь сделать это. Я действительно ценю ваш ответ с помощью примера решения. Спасибо. – Richard

Смежные вопросы