簡體   English   中英

如何在對象位於同一位置的同時旋轉畫布對象

[英]How to rotate an canvas object while the object stays on the same place

我正在創建一個Javascript游戲。 這是關於一個站在世界之巔的家伙。 我已經有一個地球,現在我需要旋轉它,但是當我旋轉它時,它也會改變它的位置。

地球 地球

如您所見,地球在自轉,但位置也在改變。 我希望它旋轉,就像從CSS旋轉關鍵幀一樣。 有什么想法嗎?

 <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="Style.css"/> </head> <body onload="draw()"> <canvas id="canvas"></canvas> </body> <script> var ctx = document.getElementById("canvas").getContext('2d'); var canvas = document.getElementById("canvas"); canvas.width = window.innerWidth; canvas.height = window.innerHeight; setInterval(draw, 10); function draw() { var img = new Image(); img.onload = function(){ ctx.rotate(1*Math.PI/180); ctx.drawImage(img,canvas.width/2-200,canvas.height/2-100,300,300); }; img.src = "earth.png"; } </script> </html> 

該代碼不起作用,因為它無法加載圖像,因為我已經下載了它,但是現在你們有了代碼,因此您可以看到問題。

看到這個小提琴

的HTML

<canvas id="canvas"></canvas>

的JavaScript

var ctx = document.getElementById("canvas").getContext('2d');
var canvas = document.getElementById("canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var img;

function draw() {
  img = new Image();
  img.onload = function(){
    setInterval(rotate, 10);
  };
  img.src = "https://pixabay.com/static/uploads/photo/2013/07/12/13/55/earth-147591_960_720.png";
}

draw();

var i = 0;
function rotate() {
  i += 1;
  drawRotatedImage(img, 100, 100, 200, 200, i);
}

var TO_RADIANS = Math.PI/180; 
function drawRotatedImage(image, x, y, width, height, angle) { 
  ctx.save();
  ctx.translate(x, y);
  ctx.rotate(angle * TO_RADIANS);
  ctx.drawImage(image, -width/2, -height/2, width, height);
  ctx.restore(); 
}

避免必須使用保存和還原的更快方法。

如果要繪制100或1000的圖像(例如用於游戲),則使用保存和還原可以區分可玩與不可玩。 在某些情況下,恢復調用可以將60fps的幀速率降至10fps以下。

使用保存和還原時,請務必小心,確保保存時沒有大的圖案或過濾器(如果支持),復雜的漸變或詳細的字體。 如果計划執行許多操作,則最好在保存和還原之前將其刪除

對於單個圖像沒有關系,並且先前的答案是最佳解決方案。

具有縮放旋轉和淡入淡出的通用精靈渲染

// draws a image centered at x,y scaled by sx,sy rotate (r in radians) and faded by alpha (0-1)and 

    function drawImage(image,x,y,sx,sy,r,alpha){ // 
        ctx.setTransform(sx,0,0,sy,x,y);
        ctx.rotate(r);
        ctx.globalAlpha = alpha;
        ctx.drawImage(image,-image.width/2,-image.height/2);
    }

而且不褪色

    function drawImage(image,x,y,sx,sy,r){ // 
        ctx.setTransform(sx,0,0,sy,x,y);
        ctx.rotate(r);
        ctx.drawImage(image,-image.width/2,-image.height/2);
    }

或者如果您想在通話后使用默認轉換

    function drawImage(image,x,y,sx,sy,r){ // 
        ctx.setTransform(sx,0,0,sy,x,y);
        ctx.rotate(r);
        ctx.drawImage(image,-image.width/2,-image.height/2);
        ctx.setTransform(1,0,0,1,0,0);
    }

由於您可能希望連續渲染許多圖像,因此可以使用以下命令恢復畫布上下文

function restoreContext(){
    ctx.globalAlpha = 1;
    ctx.setTransform(1,0,0,1,0,0);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM