1. 程式人生 > >Canvas 繪製圖像的三種方法、實現幀動畫

Canvas 繪製圖像的三種方法、實現幀動畫

繪製圖像的三種方法

/*
* 繪製圖像
* ctx.drawImage();
*/
//第一種版本 三引數版本context.drawImage(img,x,y);,把圖形繪製到指定的座標
//必須要在圖片下載之後才可以使用,使用onload事件
img.onload=function(){
ctx.drawImage(img,10,10);
}
//第二種版本 五引數版本context.drawImage(img,x,y,width,height); 把圖形繪製到指定的座標、設定影象的寬高
//必須要在圖片下載之後才可以使用
img.onload=function(){
ctx.drawImage(img,10,10,200,200);
}
//第三種版本 九引數版本 context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);
sx :開始剪下的X座標,sy:開始剪下的Y座標,swidth:被剪下影象的寬度,sheight:被剪下影象的高度
//必須要在圖片下載之後才可以使用
img.onload=function(){
ctx.drawImage(img,
100,100,200,300,
10,10,200,200);
}

實現幀動畫







canvas{
border: 1px solid salmon;
}
img{
width:300px;
height: 300px;
display: none;
}

</head>
<body>
    <canvas id="cvs" width="500" height="500"></canvas>
    <img src="../img/NPC4.png"/>
    <script src="../js/Person.js" type="text/javascript" charset="utf-8"></script>
   <script>
     var cvs = document.getElementById('cvs');
    var ctx = cvs.getContext('2d');
    var img = document.querySelector('img');

      // 必須要在圖片載入完畢之後,才能使用
    img.onload = function() {
        var person = new Person( ctx, img, 4, 4, 150, 150, 150, 150 );
        person._bind();

        // 修改direction,那麼就是修改小人的行走方向
        person.direction = 2;

        setInterval( function() {

            // 清除畫布
            ctx.clearRect( 0, 0, cvs.width, cvs.height );

            // 繪製
            person.draw();
            person.currentFrame = ++person.currentFrame >= person.widthFrame? 0 : person.currentFrame;

            // 計算下一次繪製時,小人的位置
            person.update();

        }, 100);
    }

</script>


</body>

js程式碼

(function( w ) {

// 混入式繼承( copy繼承 )
function extend( o1, o2 ) {
    for ( var key in o2 ) {
        if ( o2.hasOwnProperty( key ) ) {
            o1[ key ] = o2[ key ];
        }
    }
}

/*
 * constructor { Person } 人建構函式
 * param { ctx: Context } 繪製環境
 * param { img: Image } 繪製的影象
 * param { widthFrame: number } 影象一排有多少個人
 * param { heightFrame: number } 影象一列有多少個人
 * param { x: number } 指定人物繪製的x軸座標
 * param { y: number } 指定人物繪製的y軸座標
 * param { renderWidth: number } 人物繪製時的寬
 * param { renderHeight: number } 人物繪製時的高
 * param { speed: number } 人物行走的速度
 * */
function Person( ctx, img, widthFrame, heightFrame, x, y, renderWidth, renderHeight, speed ) {

    this.ctx = ctx;
    this.img = img;
    this.widthFrame = widthFrame;
    this.heightFrame = heightFrame;

    // 影象繪製時的座標和大小
    this.x = x;
    this.y = y;
    this.renderWidth = renderWidth;
    this.renderHeight = renderHeight;

    // 行走的速度
    this.speed = speed || 2;

    // 求一個人的寬和高
    this.width = this.img.width / this.widthFrame;
    this.height = this.img.height / this.heightFrame;

    // 當前繪製某個方向的第幾幀
    this.currentFrame = 0;

    // 當前行走的方向,預設是第一排的方向
    this.direction = 0;

    // 繫結事件
    this._bind();
}

// 給原型擴充方法
extend( Person.prototype, {

    // 繪製方法
    draw: function() {

        this.ctx.drawImage( this.img,
            this.width * this.currentFrame, this.height * this.direction, this.width, this.height,
            this.x, this.y, this.renderWidth, this.renderHeight);

    },

    // 繫結事件
    _bind: function() {

        var self = this;

        document.addEventListener( 'keydown', function( e ) {

            // 根據按鍵切換行走方向
            switch ( e.keyCode ) {
                case 37:
                    self.direction = 1;
                    break;
                case 38:
                    self.direction = 3;
                    break;
                case 39:
                    self.direction = 2;
                    break;
                case 40:
                    self.direction = 0;
                    break;
            }

        } );
    },

    // 更新小人下一陣繪製時的資料
    update: function() {

        switch ( this.direction ) {

            // 向下走,y軸加
            // 當小人向下出畫布,那麼從上邊再走出來
            case 0:
                this.y += this.speed;
                this.y = this.y > this.ctx.canvas.height? -this.height: this.y;
                break;

            // 向左走,x軸減
            // 當小人向左走出畫布,那麼從右邊再走出來
            case 1:
                this.x -= this.speed;
                this.x = this.x < -this.width? this.ctx.canvas.width: this.x;
                break;

            // 向右走,x軸加
            // 當小人向右走出畫布,那麼從左邊再走出來
            case 2:
                this.x += this.speed;
                this.x = this.x > this.ctx.canvas.width? -this.width: this.x;
                break;

            // 向上走,y軸減
            // 當小人向上出畫布,那麼從下邊再走出來
            case 3:
                this.y -= this.speed;
                this.y = this.y < -this.height? this.ctx.canvas.height: this.y;
                break;
        }

    }

} );

// 對外暴露Person
w.Person = Person;

}( window ));

相關推薦

Canvas 繪製方法實現動畫

繪製圖像的三種方法 /* * 繪製圖像 * ctx.drawImage(); */ //第一種版本 三引數版本context.drawImage(i

安裝軟件包的方法rpm包介紹及工具用法yum用法及搭建本地倉庫

安裝軟件包的三種方法、rpm包介紹及工具用法、yum用法及搭建本地倉庫一、安裝軟件包的三種方法rpm工具rpm(Redhat Package Manager)RPM軟件包管理器,是以一種數據庫記錄的方式來將我們所需要的套件安裝到Linux主機的一套管理程序。rpm包是預先在Linux機器上編譯好並打包好的文件

二十一安裝軟件包的方法RPM包介紹rpm工具用法yum工具用法yum搭建本地倉庫

rpm工具 yum工具 二十一、安裝軟件包的三種方法、RPM包介紹、rpm工具用法、yum工具用法、yum搭建本地倉庫一、安裝軟件包的三種方法rpm工具、yum工具、源碼包RPM工具:是以一種數據庫記錄的方式將需要的套件安裝到Linux主機的一套管理程序。就是說,你的Linux系統中有一個關於RPM的

安裝軟件包的方法 rpm包介紹rpm工具用法yum工具用法yum搭建本地倉庫安裝軟件包的

258866安裝軟件包的三種方法rpm包類似於windows的exe文件。rpm工具可以安裝rpm包,安裝路徑和文件名都是固定好的,不需要過多的設置。yum也可以安裝rpm包,比rpm工具好的一點是支持自動安裝依賴的包。源碼包主要是源代碼,需要誰用編譯器編譯成可執行的文件。·····rpm包介紹首先我們要把光

html li標簽前面添加方法

code ie7 first tar some text 20px AI 前端 今天無聊寫下這個例子,希望對初學者有幫助,代碼如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2

jQuery字體標的方法

com class www. 使用 mil nta 圖標 樣式 mov BootStrap框架原生圖標 在導入BootStrap包的同時,導入bootstrap-3.3.7-dist/css/bootstrap.css層疊樣式; <button type=

微信小程式引入背景方法

一。微信小程式引入背景圖的三種方法 1.直接在標籤里加上style樣式,加上背景圖: <view style="background:url('../../img/p.png')"></view> 2.如果想使用外部樣式表引入的話,直接使用background會報

多執行緒基礎概念實現執行緒方法中斷執行緒方法,以及執行緒狀態轉化

1、CPU核心數和執行緒數的關係 1:1的關係,引入超執行緒之後,就是1:2 2、cpu時間輪轉機制,即RR排程 3、程序和執行緒 程序:程式執行資源分配最小單位,程序內部有多個執行緒,多個執行緒之間會共享程序資源 執行緒:CPU排程的最小單位 4、並行和併發

安裝軟體包的方法 rpmyum 工具用法yum搭建本地倉庫

一、安裝軟體包的三種方法 rpm工具:是RPM Package Manager(RPM軟體包管理器)的縮寫 yum工具:全稱為 Yellow dog Updater, Modified)是一個在Fedora和RedHat以及CentOS中的Shell前端軟體包管理器。基於

Vue-Vue文字渲染方法 {{}}v-htmlv-text

{{ }} 將元素當成純文字輸出 v-html v-html會將元素當成HTML標籤解析後輸出 v-text v-text會將元素當成純文字輸出 程式碼: <!DOCTYPE html> <html lang="en"> <head>

安裝軟體包的方法rpm包介紹rpmyum工具用法與yum搭建本地倉庫

一、安裝軟體包的三種方法 rpm工具:RPM包是預先在linux機器上編譯好並打包好的檔案,安裝起來非常快捷。但是也有一些缺點,比如安裝的環境必須與編譯時的環境一致或者相當;包與包之間存在著相互依賴的情況 yum工具:yum最大的優勢在於可以聯網去下載所需

[iOS 繪製虛線] 轉: iOS 繪製虛線的方法

方法一:通過Quartz 2D 在 UIView drawRect:方法進行繪製虛線 - (void)drawRect:(CGRect)rect { // 可以通過 setNeedsDisplay 方法呼叫 drawRect: // Dra

iOS 繪製虛線的方法

方法一:通過Quartz 2D 在 UIView drawRect:方法進行繪製虛線- (void)drawRect:(CGRect)rect { // 可以通過 setNeedsDisplay 方法呼叫 drawRect: // Drawing code

建立方法(鄰接矩陣+鄰接表+十字連結串列)

一、鄰接矩陣 採用矩陣的方式來描述圖中的連線各非連線關係,若不能連上用無窮大或者0來表示,但是如果邊很稀少,頂點很多,那麼將會有很大的浪費。同時,這個矩陣可以同時刻畫有向圖和無向圖,無向圖就是把有向圖根據對角線對稱即可。 1、思想:建立一個結構體,它包含

canvas繪製輪廓效果

在2d圖形視覺化開發中,經常要繪製物件的選中效果。 一般來說,表達物件選中可以使用邊框,輪廓或者發光的效果。  發光的效果,可以使用canvas的陰影功能,比較容易實現,此處不在贅述。 # 繪製邊框 繪製邊框是最容易實現的效果,比如下面的圖片 ![](https://p3-juejin.by

交換兩個變量的值,不借助第個變量的 方法(JS實現)

clas img 進行 blog 算法 並且 pos 成交 方法 第一種:算術運算法 var a = 10; var b = 12; a = b - a; b = b - a; a = b + a; 它的原理是:把a、b看做數軸上的點,圍繞兩點間的距離來進行計算。

【利用鎖的方法實現在多個執行緒時只執行一個執行緒】

package test.thread;  public class TestSync {      public static void main(String[] args) {          

使用Matlab繪製的幾方法

以下六個函式都可以實現繪製三維影象: surf(xx,yy,zz); surfc(xx,yy,zz); mesh(xx,yy,zz); meshc(xx,yy,zz); meshz(xx,yy,zz

struts2開發action 的方法以及通配符路徑匹配原則常量

ucc ces pan ide exce 三種 void 動態方法 div struts2開發action 的三種方法 1、繼承ActionSupport public class UserAction extends ActionSupport {

python字符串連接的方法及其效率適用場景詳解

通過 lists bash clear 必須 內存 連接 utf-8 site python字符串連接的方法,一般有以下三種:方法1:直接通過加號(+)操作符連接website=& 39;python& 39;+& 39;tab&