<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      【開源】微信小程序、小游戲以及 Web 通用 Canvas 渲染引擎 - Cax

      2018-06-21 10:00  【當耐特】  閱讀(6435)  評論(3)    收藏  舉報

      Cax

      小程序、小游戲以及 Web 通用 Canvas 渲染引擎

      特性

      • Learn Once, Write Anywhere(小程序、小游戲、PC Web、Mobile Web)
      • 支持小程序、小游戲以及 Web 瀏覽器渲染
      • 小程序、小游戲和 Web 擁有相同簡潔輕巧的 API
      • 高性能的渲染架構
      • 超輕量級的代碼體積
      • 松耦合的渲染架構
      • 支持 Canvas 元素管理
      • 支持 Canvas 元素事件體系
      • 圖靈完畢的 group 嵌套體系
      • 內置 tween 運動能力
      • 內置文本、位圖、序列幀、繪圖對象和多種矢量繪制對象

      一分鐘入門小程序 cax 使用

      到 GitHub 下載 cax 自定義組件,然后小程序引入 cax 自定義組件:

      └── cax
          ├── cax.js
          ├── cax.json  
          ├── cax.wxml  
          ├── cax.wxss
          └── index.js
      

      在 page 或者 component 里聲明依賴:

      {
        "usingComponents": {
          "cax":"../cax/cax"
        }
      }
      

      在的 wxml 里引入 cax 標簽:

      <cax id="myCanvas"></cax>
      

      在 js 里渲染邏輯:

      import cax from '../cax/index'
      
      Page({
        onLoad: function () {
          //比 web 里使用 cax 多傳遞 this,this 代表 Page 或 Component 的實例
          const stage = new cax.Stage(200, 200, 'myCanvas', this)
          const rect = new cax.Rect(100, 100, {
            fillStyle: 'black'
          })
          
          rect.originX = 50
          rect.originY = 50
          rect.x = 100
          rect.y = 100
          rect.rotation = 30
      
          rect.on('tap', () => {
            console.log('tap')
          })
      
          stage.add(rect)
          stage.update()
        }
      })
      

      效果如下所示:

      除了 tap 事件,也可以幫 rect 綁定其他觸摸事件:

      rect.on('touchstart', () => {
        console.log('touchstart')
      })
      
      rect.on('touchmove', () => {
        console.log('touchmove')
      })
      
      rect.on('touchend', () => {
        console.log('touchend')
      })
      

      一分鐘入門小游戲 cax 使用

      到 GitHub 下載 cax 小游戲示例,目錄結構和運行效果如下:

      const stage = new cax.Stage()
      

      和小程序以及 Web 不同的是,小游戲創建 Stage 不需要傳任何參數。

      一分鐘入門 Web cax 使用

      通過 npm 或者 CDN 獲取:

      npm i cax
      
      import cax from 'cax'
      
      const stage = new cax.Stage(200, 200, '#renderTo')
      const rect = new cax.Rect(100, 100, {
        fillStyle: 'black'
      })
      
      stage.add(rect)
      stage.update()
      

      除了 Stage 構造函數比小程序第四個參數 this,其他使用方式都一樣。

      內置對象

      Group

      用于分組, group 也可以嵌套 group,父容器的屬性會疊加在子屬性上, 比如:

      • group 的 x 是 100, group 里的 bitmap 的 x 是 200, 最后 bitmap 渲染到 stage 上的 x 是 300
      • group 的 alpha 是 0.7, group 里的 bitmap 的 alpha 是 0.6, 最后 bitmap 渲染到 stage 上的 alpha 是 0.42
      const group = new cax.Group()
      const rect = new cax.Rect(100, 100 {
        fillStyle: 'black'
      })
      group.add(rect)
      stage.add(group)
      stage.update()
      

      group 擁有常用的 add 和 remove 方法進行元素的增加和刪除。先 add 的會先繪制,所有后 add 的會蓋在先 add 的上面。

      Bitmap

      const bitmap = new cax.Bitmap(img)
      stage.add(bitmap)
      stage.update()
      

      如果只傳 url 而不是 Image 對象的實例,需要這樣:

      const bitmap = new cax.Bitmap('./wepay.png', ()=>{
        stage.update()
      })
      stage.add(bitmap)
      

      這里需要注意小程序需要配置 downloadFile 需要配置合法域名才能正常加載到圖片。

      可以設置圖片裁剪顯示區域,和其他 transform 屬性:

      bitmap.rect = [0, 0, 170, 140]
      bitmap.x = 200
      

      Sprite

      序列幀動畫組件,可以把任意圖片的任意區域組合成一串動畫。

      const sprite = new cax.Sprite({
          framerate: 7,
          imgs: ['./mario-sheet.png'],
          frames: [
              // x, y, width, height, originX, originY ,imageIndex
              [0, 0, 32, 32],
              [32 * 1, 0, 32, 32],
              [32 * 2, 0, 32, 32],
              [32 * 3, 0, 32, 32],
              [32 * 4, 0, 32, 32],
              [32 * 5, 0, 32, 32],
              [32 * 6, 0, 32, 32],
              [32 * 7, 0, 32, 32],
              [32 * 8, 0, 32, 32],
              [32 * 9, 0, 32, 32],
              [32 * 10, 0, 32, 32],
              [32 * 11, 0, 32, 32],
              [32 * 12, 0, 32, 32],
              [32 * 13, 0, 32, 32],
              [32 * 14, 0, 32, 32]
          ],
          animations: {
              walk: {
                  frames: [0, 1]
              },
              happy: {
                  frames: [5, 6, 7, 8, 9]
              },
              win: {
                  frames: [12]
              }
          },
          playOnce: false,
          currentAnimation: "walk",
          animationEnd: function () {
      
          }
      });
      

      Text

      文本對象

      const text = new cax.Text('Hello World', {
        font: '20px Arial',
        color: '#ff7700',
        baseline: 'top'
      })
      

      Graphics

      繪圖對象,用于使用基本的連綴方式的 Canvas 指令繪制圖形。

      const graphics = new cax.Graphics()
      graphics
          .beginPath()
          .arc(0, 0, 10, 0, Math.PI * 2)
          .closePath()
          .fillStyle('#f4862c')
          .fill()
          .strokeStyle('black')
          .stroke()
      
      graphics.x = 100
      graphics.y = 200
      
      stage.add(graphics)
      

      Shape

      與 Graphics 不同的是, Shape 一般擁有有限的寬高,所以可以使用離屏 Canvas 進行緩存。下面這些屬于 Shape。

      Rect

      const rect = new cax.Rect(200, 100, {
        fillStyle: 'black'
      })
      

      Circel

      const circel = new cax.Circel(10)
      

      Ellipse

      const ellipse = new cax.Ellipse(10)
      

      注意:從技術上小游戲和 Web 可以離屏 Canvas,小程序不行,因為小程序不支持動態創建離屏 Canvas。

      Element

      Element 是多種元素的組合,如 Bitmap、Group、 Text、 Shape 等混合起來的圖像。

      Button

      const button = new cax.Button({
        width: 100,
        height: 40,
        text: "Click Me!"
      })
      

      屬性

      Transform

      屬性名 描述
      x 水平偏移
      y 豎直偏移
      scaleX 水平縮放
      scaleY 豎直縮放
      rotation 旋轉
      skewX 歪斜 X
      skewY 歪斜 Y
      originX 旋轉基點 X
      originY 旋轉基點 Y

      Alpha

      屬性名 描述
      alpha 元素的透明度

      注意這里父子都設置了 alpha 會進行乘法疊加。

      compositeOperation

      屬性名 描述
      compositeOperation 源圖像繪制到目標圖像上的疊加模式

      注意這里如果自身沒有定義 compositeOperation 會進行向上查找,找到最近的定義了 compositeOperation 的父容器作為自己的 compositeOperation。

      Cursor

      屬性名 描述
      cursor 鼠標移上去的形狀

      事件

      小程序事件

      事件名 描述
      tap 手指觸摸后馬上離開
      touchstart 手指觸摸動作開始
      touchmove 手指觸摸后移動
      touchend 手指觸摸動作結束
      drag 拖拽

      Web 事件

      事件名 描述
      click 元素上發生點擊時觸發
      mousedown 當元素上按下鼠標按鈕時觸發
      mousemove 當鼠標指針移動到元素上時觸發
      mouseup 當在元素上釋放鼠標按鈕時觸發
      mouseover 當鼠標指針移動到元素上時觸發
      mouseout 當鼠標指針移出元素時觸發
      tap 手指觸摸后馬上離開
      touchstart 手指觸摸動作開始
      touchmove 手指觸摸后移動
      touchend 手指觸摸動作結束
      drag 拖拽

      自定義對象

      自定義 Shape

      自定義 Shape 繼承自 cax.Shape:

      class Sector extends cax.Shape {
        constructor (r, from, to, option) {
          super()
      
          this.option = option || {}
          this.r = r
          this.from = from
          this.to = to
        }
      
        draw () {
          this.beginPath()
            .moveTo(0, 0)
            .arc(0, 0, this.r, this.from, this.to)
            .closePath()
            .fillStyle(this.option.fillStyle)
            .fill()
            .strokeStyle(this.option.strokeStyle)
            .lineWidth(this.option.lineWidth)
            .stroke()
        }
      }
      

      使用 Shape:

      const sector = new Sector(10, 0, Math.PI/6, {
        fillStyle: 'red'
        lineWidth: 2
      })
      stage.add(sector)
      stage.update()
      

      自定義 Element

      自定義 Element 繼承自 cax.Group:

      class Button extends cax.Group {
        constructor (option) {
          super()
          this.width = option.width
          this.roundedRect = new  cax.RoundedRect(option.width, option.height, option.r)
          this.text = new cax.Text(option.text, {
            font: option.font,
            color: option.color
          })
      
          this.text.x = option.width / 2 - this.text.getWidth() / 2 * this.text.scaleX
          this.text.y = option.height / 2 - 10 + 5 * this.text.scaleY
          this.add(this.roundedRect, this.text)
        }
      }
      
      export default Button
      

      使用:

      const button = new cax.Button({
        width: 100,
        height: 40,
        text: "Click Me!"
      })
      

      一般情況下,稍微復雜組合體都建議使用繼承自 Group,這樣利于擴展也方便管理自身內部的元件。
      可以看到小游戲的 DEMO 里的 Player、Bullet、Enemy、Background 全都是繼承自 Group。

      License

      MIT

      主站蜘蛛池模板: 成人片黄网站色大片免费毛片| 特级毛片在线大全免费播放 | 国内在线视频一区二区三区| 国产福利片无码区在线观看| 国产精品久久国产三级国不卡顿| 日韩精品一区二区三区四| 亚洲AV成人一区国产精品| 久久精品一本到东京热| 国内自拍av在线免费| 成人国产精品中文字幕| 亚洲最大中文字幕无码网站| 亚洲激情一区二区三区视频 | 成人一区二区不卡国产| 国产99视频精品免费专区| 无码人妻精品一区二区三区蜜桃| 国产成人精品无码免费看| 国产精品一区二区传媒蜜臀| 起碰免费公开97在线视频| 妺妺窝人体色www聚色窝仙踪| 樱花影院电视剧免费| 午夜精品福利亚洲国产| 97人人添人澡人人爽超碰| 国产成人欧美日本在线观看| 亚洲天堂男人影院| 日本深夜福利在线观看| 亚洲一区二区三区丝袜| 大陆熟妇丰满多毛xxxx| 中文字幕精品人妻丝袜| 97国产成人无码精品久久久| 日本高清中文字幕一区二区三区| 久久婷婷五月综合色丁香花| 性色欲情网站| 99久久精品国产熟女拳交| 亚洲综合色成在线观看| 亚洲欧美高清在线精品一区二区| 老妇肥熟凸凹丰满刺激| 国产精品一区二区性色av| 最近最好的2019中文| 亚洲国产欧美在线看片一国产 | 最近2019中文字幕免费看| 国产精品无码a∨麻豆|