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、並行和併發
安裝軟體包的三種方法、 rpm、yum 工具用法、yum搭建本地倉庫
一、安裝軟體包的三種方法 rpm工具:是RPM Package Manager(RPM軟體包管理器)的縮寫 yum工具:全稱為 Yellow dog Updater, Modified)是一個在Fedora和RedHat以及CentOS中的Shell前端軟體包管理器。基於
Vue-Vue文字渲染三種方法 {{}}、v-html、v-text
{{ }} 將元素當成純文字輸出 v-html v-html會將元素當成HTML標籤解析後輸出 v-text v-text會將元素當成純文字輸出 程式碼: <!DOCTYPE html> <html lang="en"> <head>
安裝軟體包的三種方法、rpm包介紹、rpm、yum工具用法與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&