目前 vue 文件的生成在 fork 的 vue 库中更新,此项目暂时搁置,等到更多细节确定后作为 template https://github.com/voderl/vue
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
: {
animationTime
:AnimatedSprite
的默认每帧时长,默认为 500mstextures
:<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
将宽度拉伸到 widthheight
将高度拉伸到 heightdata
传入一个对象,将此对象 deepAssign 到 pixi 节点本身( 相当于直接改 pixi 节点的属性)tint
传入一个颜色,将改变色相,不支持透明度,首要考虑请考虑 0xffffff 16 进制数字类型,其他类型也支持。anchor
传入一个{ x: 0-1, y: 0-1 }
的对象,如果传入一个数字 则将 x,y 都设置为此数字。scale
拉伸,写法同上。不过设置 width 和 height 影响 scale,更改 scale 也会影响 width、heightfit
使该节点自适应大小。<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]'> 为简略写法,
基本容器,性能消耗较小
<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
同 sprite 基本一致,不过只支持Sprite
类型
其 width 和 height 设置 将以该 sprite 重复覆盖至 width 和 height
支持 style 属性,style 属性列表请看 http://pixijs.download/release/docs/PIXI.TextStyle.html
<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 创建时消耗资源较大,合理使用
创建画笔什么的绘制图案。 使用 ref 来获取到该元素对应的 pixi 节点,然后使用 pixi 节点的方法绘制。 http://pixijs.download/release/docs/PIXI.Graphics.html
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 源码中的 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
全局变量。
- 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 - 主体节点的基本函数,如生成删除。
- config
- 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)
- 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 是否存在
npm install
npm run serve
npm run build
npm run lint