Skip to content

DEPRECATED use vue platform to render pixi canvas

Notifications You must be signed in to change notification settings

voderl/vue-pixi

Repository files navigation

DEPRECATED

vue-pixi

目前 vue 文件的生成在 fork 的 vue 库中更新,此项目暂时搁置,等到更多细节确定后作为 template https://github.com/voderl/vue

pixi 拓展

Texture

  • Loading - 加载过程中图片 Loading 字样 100*100
  • Error - 加载错误图片 Error 字样 100*100
  • splitTexture
@row 为数组时返回分割为数组对应的对象,为数字时为分割的份数
@col 同上
function splitTexture(texture, row, col)

Texture.splitTexture(texture, ['down', 'left', 'right', 'up'], 4);
将把texture分割为4*4, 返回 {
  down: [4]texture,
  left: [4]texture,
  right: [4]texture,
  up: [4]texture
}
  • split
function split(texture, dx, dy, dw, dh)

返回被切割部分的texture

Vue.pixiConfig: {

  • animationTimeAnimatedSprite的默认每帧时长,默认为 500ms
  • textures: <sprite>value</sprite>填写 value 或 src 时所寻找的命名空间。如果根据 value 未找到图片则直接返回Texture.Loading,并在textures里面设置 setter 和 getter,getter 返回'waiting', setter 当设置时自动更新目前为 Loading 的图案。
  • autoload: 默认为true, 未找到 value 时是否以 value 为 src 加载
  • keyEvent: 为了完成 keydown、keyup 事件的实现。在 window 上监听了 keydown 和 keyup。使用 keyEvent.disable() 来删除监听的事件。
    }

基本类型

  • container 容器 => Container
  • text
  • sprite - 传递 src,在pixiConfig.textures命名空间里面寻找
  • zone
  • tiling - 和 sprite 类似,但是传入 width 和 height 将重复图片来覆盖。
  • graphics - Graphics ,具体使用见 pixi API
  • particle - ParticleContainer ,一般不使用,可能需要使用粒子效果的组件需要

基础属性

  • x x 坐标位置
  • y y 坐标位置
  • zIndex 优先级, 默认按照先低后高的优先级绘制,请尽量不要使用此属性
  • width 将宽度拉伸到 width
  • height 将高度拉伸到 height
  • data 传入一个对象,将此对象 deepAssign 到 pixi 节点本身( 相当于直接改 pixi 节点的属性)
  • tint 传入一个颜色,将改变色相,不支持透明度,首要考虑请考虑 0xffffff 16 进制数字类型,其他类型也支持。
  • anchor 传入一个{ x: 0-1, y: 0-1 }的对象,如果传入一个数字 则将 x,y 都设置为此数字。
  • scale 拉伸,写法同上。不过设置 width 和 height 影响 scale,更改 scale 也会影响 width、height
  • fit 使该节点自适应大小。
      <text :fit='{zone: [x, y, width, height], ratio: [minRatio, maxRatio], type: "center" }'></text>
      type 为 center, left, top, right, bottom 中的一个,默认为center,
      minRatio 和 maxRatio 是自适应大小放缩的最小比例和最大比例,如果ratio传入数字则锁定放缩比例
      <text :x="100" :y="100" :fit='[width, height]'> 为简略写法,

container

基本容器,性能消耗较小

sprite

<sprite :src='value2'>value1</sprite>

value1 的优先级大于 value2,当没有 value1 时按照 value2 处理。 以 value 为 key 在Vue.pixiConfig.textures命名空间中查找

  • 如果找到了
    • 找到的是 Texture,生成 Sprite
    • 找到的是[]Texture, 生成 AnimatedSprite, 默认每帧播放时间为 Vue.pixiConfig.animationTime(默认直接播放);
    • 找到的是一个对象, 如下
    {
        down: []Texture,
        up: []Texture,
        left: []Texture,
        right: []Texture
    }
    则以Object.values[0]来生成 AnimatedSprite,可以使用change方法来更换status,或者直接传入status参数
  • 如果没找到
    • Vue.pixiConfig.autoload为 true 时(默认为 true),以 src 加载该资源
    • Vue.pixiConfig.textures中以该 value 设置一个 get、set,get 返回'waiting',当 set 时,自动更新当前使用这个尚未存在的 texture 的节点。
  • 默认情况下未找到返回Texture.Loading

tiling

同 sprite 基本一致,不过只支持Sprite类型 其 width 和 height 设置 将以该 sprite 重复覆盖至 width 和 height

text

支持 style 属性,style 属性列表请看 http://pixijs.download/release/docs/PIXI.TextStyle.html

zone

<zone
  :style="{
    width: 100,
    height: 100,
    radius: 0.2,   [0~0.5]的一个值
    fillColor: 'red',
    fillAlpha: 1,  [0~1]
    lineWidth: 3,	strokeLine的宽度
    lineColor: 'blue',
    lineAlpha: 1,  [0~1]
    alignment: 1,	strokeLine相对zone的位置,如果为0.5线宽一半在里面,一半在外面
    				为1表明全部在外面
  }"
    >
</zone>

zone 创建时消耗资源较大,合理使用

graphics

创建画笔什么的绘制图案。 使用 ref 来获取到该元素对应的 pixi 节点,然后使用 pixi 节点的方法绘制。 http://pixijs.download/release/docs/PIXI.Graphics.html

particleContainer

pixijs 的另一种高性能的 Container,不过一个 Container 只支持一种 Texture,一些高级属性什么的也不支持 主要用于粒子特效,当然,在这里它还没什么用

事件

键盘事件

Vue.pixiConfig.keyEvent

function keydownListener(e) {
  e.stopPropagation();
  keyEvent.do('keydown', e);
}
function keyupListener(e) {
  e.stopPropagation();
  keyEvent.do('keyup', e);
}

事件监听类似如上,如果取消默认的 window 监听的事件,则调用 keyEvent.disable(); 目前仅支持 keydown 和 keyup

function(event, code) {

}

传入的第二个参数为 code,具体见https://developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/code 同时请尽量采用第二个参数 code,而不是第一个参数 event.code,因为keyEvent里面有一个 mapping, code 是已经经过 mapping 的结果

鼠标事件

http://pixijs.download/release/docs/PIXI.Sprite.html#event:click 左侧 events 栏

pointer 是兼容 mouse 和 touch 的

  • ​ pointerdown 按下

  • ​ pointerup 松起

  • pointermove 移动

  • pointertap 点击

  • pointerout 移出该元素

vue 源码更改

更改 vue 源码中的 platform 来实现渲染到 pixi canvas。
文件目录 platform 中即为对应 vue/src/platform 里的更改。

其余更改为 vue/src/core/vdom/vnode.js 第 43 行。

(更改原因是当没有 data 存在时,不进入 diff 流程,而像<text>value</text>这样的话,没有 data,但是有 value,value 应当进入 diff 流程更新,因此需要有 data)

- this.data = data
+ this.data = data || {};

更改了vue/src/core/vdom/patch.js./core/vdom/patch.js 搜索 // change

增加了一个 controller,用于控制 diff 过程中节点的生成。因为节点的生成和最初的一次渲染极其耗时,每一帧如果耗时过长则过渡到下一帧生成。

  • 好处 : 更加缓和,即使节点过多也不会忽然卡一下子而是逐渐显示。将执行时间放到最短的示例如下。

  • 坏处 : 如果有大量节点变动可能会造成闪动(或许可以考虑删除时也控制一下,但是删除不会卡顿(×

构建的 vue 文件路径为 vue.js 该文件需要pixi.js-legacy依赖,或者暴露PIXI全局变量。

DEMO

http://voderl.cn/try3

platforms/web/路径

  • pixi
    • config
      • handleConfig - 处理 userConfig
      • methods - userConfig 中用到的一些方法
      • pixiConfig - pixi 的拓展和一些配置
      • userConfig - 定义各种 tag 基础标签和对应的基本 diff 函数,便于自定义
      • utils - config 中使用到的一些方法
    • event
      • keyEvent - 按键事件的处理
      • listener - 监听事件的处理,由于事件传递的为相应的包装函数,因此不能进入 diff 中,需要单独处理
    • modules - 只有 data.js 和 index.js 被使用
      • data - diff And Patch 部分的主体
    • pixi-nodes - 主体节点的基本函数,如生成删除。
  • util

    vue 内部判断工具,比如判断是否为 tagName,是否为 svg 啥的,以及一些工具函数

  • entry-runtime.js 入口文件

问题

  • 目前 class 无效。
  • pixi.js - Graphics 是一种创建时高消耗,不变时高性能的图形。使用 Graphics 能满足自定义一些简单的选项,但耗时过高,比如 zone 类型。
  • 没有引入补间动画库,也没弄一些简单的动画效果,如 show,hide 选项,传递数值或函数表明渐入和渐出效果。
  • 可能有许多已知或未知的 bug

更改

  • 一些属性在删除时没有设置默认值,以值为 undefined 来更新,造成一些错误
  • diffandpatch 设定一个任务序列,处理超时自动下一帧处理.(diffAndPatch 本身就占用较少,82 个节点最多 3、4ms 的样子,直接处理了生成函数,效果显著);
  • 改 value 获取方式: 传入 getValue 函数,默认优先级<sprite src='value2'>value</sprite>,value 大于 value2
  • 更新 controller,controller 在 createChildren 时挟持掉 createElm,但是 createElm 也是创建子组件的方法,会导致子组件在创建时不能正常触发 hook(如 mounted 等方法),因此将创建子组件和创建子元素分离开来,确保组件都是直接创造执行,子元素进入 controller。(此处可能有 bug)

TODO

  • AnimatedSprite 默认直接播放,可以考虑增加个参数让其默认停止
  • interactiveChildren 的设置,默认 pixi 节点的 interactiveChildren 为 true。

    当有事件触发时,沿着 interactiveChildren 为 true 的路线遍历 pixi 节点树来寻找 interactive 为 true 的节点触发事件,因此将子代没有 interactive 的节点的 interactiveChildren 置为 false 可以提高性能。 但是涉及到 interactive 节点的消失和增加,在此先行搁置。

  • 还有考虑将 userConfig 不打包,作为外部依赖。 或者提供增加新类型的方法,完善具体写法 api
  • 增加 controller 配置到 pixiConfig,自行配置 是否使用 controller、controller 每帧最高执行时间。
  • 增加一些内部 hook,比如获取 Texture 等方法
  • 增加默认组件,如 hero 组件,hero 组件可指定是否 control 操作。
  • 可以考虑增加单个组件,组件内容可自行创造,就像 vue 创建 canvas 元素一样,内部的操作自行实现。
  • 增加一个可自定义标签的函数 如,Vue.register
  • 更改基础的 diff 函数,或者增加基础指令,比如自定义对 show、hide 的处理,拓展一个 diff 对象
  • 增加 hitArea 属性,比如要手动扩大点击范围
  • 最主要的是,当一个不确定宽度或者高度的元素排列了,那怎么进行排版
  • 注册一个 Container
  • patch 的操作是异步的,导致$refs 获取不到,请全部 patch 完成后再触发 mountedHook
  • 每一个节点 在生成时,可以不设置,在被加入时,都触发 parent 的 sizeChange 在被删除时都触发 parent 的 sizeChange 在被改变
  • 在 child 被加入或被移除时,触发检测自身 size 改变的函数,在自身改变后,向上触发检测自身改变,检测自身改变触发自身改变再向上触发检测自身改变
  • 流程控制, 被我干掉了,(异步好恶心,数不清的 bug)。为了性能,顶多在 nodeOps 里面增加删除节点时使用流程控制了。毕竟第一次渲染也要好几十 ms
  • display => flex 全部使用 flex 布局, container 没 anchor ,anchor 赋值时判断 anchor 是否存在

Project setup

npm install

Compiles and hot-reloads for development

npm run serve

Compiles and minifies for production

npm run build

Lints and fixes files

npm run lint

Customize configuration

See Configuration Reference.

About

DEPRECATED use vue platform to render pixi canvas

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published