Commit 24e2e305 authored by wjf's avatar wjf

2.0.23

parent 8382b873
...@@ -14,5 +14,4 @@ rollup.config.js ...@@ -14,5 +14,4 @@ rollup.config.js
record.txt record.txt
test test
examples examples
docs docs
aaa.html \ No newline at end of file
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -40,8 +40,6 @@ ...@@ -40,8 +40,6 @@
window.addEventListener("load", async function () { window.addEventListener("load", async function () {
//获取canvas //获取canvas
var canvas = document.getElementById("canvas"); var canvas = document.getElementById("canvas");
canvas.width = document.body.clientWidth * (window.devicePixelRatio || 1)
canvas.height = document.body.clientHeight * (window.devicePixelRatio || 1)
//淘宝小程序上canvas用自己的方式建 //淘宝小程序上canvas用自己的方式建
// var canvas = await new Promise((r) => { // var canvas = await new Promise((r) => {
// my.createCanvas({ // my.createCanvas({
...@@ -72,18 +70,14 @@ ...@@ -72,18 +70,14 @@
sysInfo && sysInfo.windowWidth || document.body.clientWidth, sysInfo && sysInfo.windowWidth || document.body.clientWidth,
sysInfo && sysInfo.windowHeight || document.body.clientHeight, sysInfo && sysInfo.windowHeight || document.body.clientHeight,
FYGE.RENDERER_TYPE.CANVAS, FYGE.RENDERER_TYPE.CANVAS,
false,
false,
sysInfo && sysInfo.pixelRatio || window.devicePixelRatio || 1//分辨率
); );
//监听窗口缩放,按需,一般移动端的不需要 //监听窗口缩放,按需,一般移动端的不需要
window.addEventListener('resize', () => { stage.resize() }); window.addEventListener('resize', () => { stage.resize() });
//鼠标事件 //鼠标事件
var mouseEvent = stage.onMouseEvent.bind(stage); stage.addWebMouseEvent();
canvas.addEventListener("touchstart", mouseEvent, false);
canvas.addEventListener('touchmove', mouseEvent, false);
canvas.addEventListener('touchend', mouseEvent, false);
//pc
canvas.addEventListener("mousedown", mouseEvent, false);
canvas.addEventListener('mousemove', mouseEvent, false);
canvas.addEventListener('mouseup', mouseEvent, false);
//stage初始化 //stage初始化
stage.addEventListener(FYGE.Event.INIT_STAGE, async () => { stage.addEventListener(FYGE.Event.INIT_STAGE, async () => {
...@@ -248,8 +242,8 @@ ...@@ -248,8 +242,8 @@
// s.lineTo(10, 10); // s.lineTo(10, 10);
// s.endStroke() // s.endStroke()
var s = stage.addChild(new FYGE.Graphics()) var s = stage.addChild(new FYGE.Graphics())
s.lineStyle(5,0,1,1) s.lineStyle(5, 0, 1, 1)
s.arc(100,100,40,0,Math.PI*2) s.arc(100, 100, 40, 0, Math.PI * 2)
s.endStroke() s.endStroke()
//测试svga蒙版 //测试svga蒙版
...@@ -257,7 +251,14 @@ ...@@ -257,7 +251,14 @@
stage.addChild(new FYGE.MovieClip(v)).y -= 100 stage.addChild(new FYGE.MovieClip(v)).y -= 100
}) })
// console.log( FYGE.toDisplayDataURL(stage,null,{type: "jpeg"})) // var ss = stage.addChild(new FYGE.EditableText())
// ss.size = 40;
// ss.prompt = "啊实打实大苏打"
// ss.addEventListener("oninput",(e)=>{
// console.log(e)
// })
// console.log( FYGE.toDisplayDataURL(stage,null,{type: "jpeg"}))
}, this); }, this);
//循环 //循环
......
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Document</title>
<meta name="viewport"
content="width=device-width,initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="full-screen" content="true" />
<meta name="screen-orientation" content="portrait" />
<meta name="x5-fullscreen" content="true" />
<meta name="360-fullscreen" content="true" />
<style>
body,
html {
background-color: #fff;
margin: 0px;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
}
</style>
<script src="../build/fyge.min.js"></script>
</head>
<body>
<div id="cusEngine" style="line-height:0;font-size:0;position: absolute;">
<canvas id="canvas" style="width: 100%;height: 100%"></canvas>
</div>
<script>
window.addEventListener("load", async function () {
//舞台
var stage = new FYGE.Stage(
document.getElementById("canvas"),
750,//设计宽度,按设计搞给的就行
1624,//设计高度
document.body.clientWidth,
document.body.clientHeight,
FYGE.RENDERER_TYPE.WEBGL,
false,
false,
window.devicePixelRatio || 1
);
(function loop() {
stage.flush();
FYGE.Tween.flush();
requestAnimationFrame(loop)
})()
var URL = window.webkitURL || window.URL;
var container = document.getElementById("cusEngine");
/*拖拽的目标对象------ document 监听drop 并防止浏览器打开客户端的图片*/
document.ondragover = function (e) {
e.preventDefault(); //只有在ondragover中阻止默认行为才能触发 ondrop 而不是 ondragleave
};
document.ondrop = function (e) {
e.preventDefault(); //阻止 document.ondrop的默认行为 *** 在新窗口中打开拖进的图片
};
/*拖拽的源对象----- 客户端的一张图片 */
/*拖拽目标对象-----div#container 若图片释放在此元素上方,则需要在其中显示*/
container.ondragover = function (e) {
e.preventDefault();
};
container.ondrop = function (e) {
var files = [];
[].forEach.call(e.dataTransfer.files, function (file) {
files.push(file);
}, false);
name = files[0].name;
console.log(name)
var src = URL.createObjectURL(files[0]);
//清空
stage.removeAllChildren()
// console.log(files)
//加载
FYGE.GlobalLoader.loadJson((s, json) => {
var l = stage.addChild(new FYGE.Lottie(json))
l.position.set((750 - json.w) / 2, (stage.viewRect.height - json.h) / 2);
l.play();
}, src)
}
})
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>spine预览</title>
<meta name="viewport"
content="width=device-width,initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="full-screen" content="true" />
<meta name="screen-orientation" content="portrait" />
<meta name="x5-fullscreen" content="true" />
<meta name="360-fullscreen" content="true" />
<style>
body,
html {
background-color: #fff;
margin: 0px;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
}
input {
background: #777777;
border-color: #1890ff;
box-shadow: 0 2px 0 rgb(0 0 0 / 5%);
color: #fff;
text-shadow: 0 -1px 0 rgb(0 0 0 / 12%);
}
</style>
<script src="../build/fyge.min.js"></script>
</head>
<body>
<div id="cusEngine" style="line-height:0;font-size:0;position: absolute;">
<canvas id="canvas" style="width: 100%;height: 100%"></canvas>
</div>
<div id="anis" style="position: absolute;z-index: 999;top:5%;width: 5%;">
</div>
<div id="skins" style="position: absolute;z-index: 999;top:5%;right:0%;width: 5%;">
</div>
<input type="text" id="key0" value="x" style="position: absolute;z-index: 999;width: 10%;left:35%;top:5%">
<input type="text" id="val0" value="y" style="position: absolute;z-index: 999;width: 10%;right:35%;top:5%">
<script>
window.addEventListener("load", async function () {
//舞台
var stage = new FYGE.Stage(
document.getElementById("canvas"),
750,//设计宽度,按设计搞给的就行
1624,//设计高度
document.body.clientWidth,
document.body.clientHeight,
FYGE.RENDERER_TYPE.WEBGL,
false,
false,
window.devicePixelRatio || 1
);
var text = stage.addChild(new FYGE.TextField());
text.size = 50;
text.textWidth = 750;
text.textAlign = "center";
text.textHeight = stage.stageHeight;
text.verticalAlign = "middle"
text.fillColor = "#999999";
text.text = "拖入一个spi文件或\n三个json,atlas,png文件";
(function loop() {
stage.flush();
FYGE.Tween.flush();
requestAnimationFrame(loop)
})()
var URL = window.webkitURL || window.URL;
var container = document.getElementById("cusEngine");
/*拖拽的目标对象------ document 监听drop 并防止浏览器打开客户端的图片*/
document.ondragover = function (e) {
e.preventDefault(); //只有在ondragover中阻止默认行为才能触发 ondrop 而不是 ondragleave
};
document.ondrop = function (e) {
e.preventDefault(); //阻止 document.ondrop的默认行为 *** 在新窗口中打开拖进的图片
};
/*拖拽的源对象----- 客户端的一张图片 */
/*拖拽目标对象-----div#container 若图片释放在此元素上方,则需要在其中显示*/
container.ondragover = function (e) {
e.preventDefault();
};
container.ondrop = async function (e) {
var files = [];
[].forEach.call(e.dataTransfer.files, function (file) {
files.push(file);
}, false);
if (files.length == 1 && getFile(files, "spi")) {
var src = URL.createObjectURL(files[0]);
//清空
stage.removeAllChildren()
// console.log(files)
//加载
FYGE.loadSpine(
src,
(spineData) => {
creatSpine(spineData)
},
(e) => {
console.log(e)
}
)
}
else if (files.length == 3 &&
getFile(files, "png") &&
getFile(files, "json") &&
getFile(files, "atlas")
) {
//清空
stage.removeAllChildren()
var textures = await new Promise((r) => {
FYGE.loadAtlas(
URL.createObjectURL(getFile(files, "atlas")),
(d) => {
r(d)
},
(e) => { console.log(e) },
URL.createObjectURL(getFile(files, "png"))
)
})
console.log(textures)
FYGE.GlobalLoader.loadJson((s, res) => {
res.textures = textures
creatSpine(res)
},
URL.createObjectURL(getFile(files, "json")),
)
}else{
console.error("文件有误")
}
}
function creatSpine(spineData) {
console.log("spineData:", spineData)
var { width, height, x, y } = spineData.skeleton
var spine = new FYGE.Spine(spineData)
console.log("spine:", spine)
stage.addChild(spine)
spine.position.set(375, 800)
console.log("动画名称:", spine.aniNames)
console.log("皮肤名称:", spine.skinNames)
console.log("位置:", spine.position)
createAnis(spine)
createSkins(spine)
//添加输入框xy
}
})
function getFile(files, str) {
for (var i = 0; i < files.length; i++) {
if (files[i].name.indexOf("." + str) > 0) {//先这样判断,当然不保险
return files[i]
}
}
return null
}
function createAnis(spine) {
var arr = spine.aniNames;
var div = document.getElementById("anis");
div.innerHTML = ""
for (var i = 0; i < arr.length; i++) {
let ani = arr[i];
var o = document.createElement("input");
o.type = "button";
o.style.margin = "7px";
o.style.minWidth = "50px";
o.value = ani;
o.addEventListener("click", () => {
spine.animationManager.showAni(ani, 0)
});
div.appendChild(o)
}
}
function createSkins(spine) {
var arr = spine.skinNames;
var div = document.getElementById("skins");
div.innerHTML = ""
for (var i = 0; i < arr.length; i++) {
let skin = arr[i];
var o = document.createElement("input");
o.type = "button";
o.style.margin = "7px";
o.style.minWidth = "50px";
o.style.float = "right"
o.value = skin;
o.addEventListener("click", () => {
spine.setSkin(skin)
});
div.appendChild(o)
}
}
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<meta name="viewport"
content="width=device-width,initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="full-screen" content="true" />
<meta name="screen-orientation" content="portrait" />
<meta name="x5-fullscreen" content="true" />
<meta name="360-fullscreen" content="true" />
<!-- 加载svga文件用 npm svga-parser-->
<script src="./js/svgaParser.min.js"></script>
<!-- 主引擎 -->
<script src="../build/fyge.min.js"></script>
<style>
html,
body {
padding: 0;
margin: 0;
border: 0;
width: 100%;
height: 100%;
overflow: hidden;
position: absolute;
background-color: #eeeeee;
}
</style>
</head>
<body>
<div id="cusEngine" style="line-height:0;font-size:0;position: absolute;">
<canvas id="canvas" style="width: 100%;height: 100%"></canvas>
</div>
<script src="//yun.duiba.com.cn/db_games/libs0924/stats.js"></script>
</body>
<script>
window.addEventListener("load", async function () {
//获取canvas
var canvas = document.getElementById("canvas");
canvas.width = document.body.clientWidth * (window.devicePixelRatio || 1)
canvas.height = document.body.clientHeight * (window.devicePixelRatio || 1)
//建舞台,定宽适配,会根据实际窗口尺寸上下裁切,所以stage实际y坐标会偏移stage.viewRect.y
var stage = new FYGE.Stage(
canvas,
750,//设计宽度,按设计搞给的就行
1624,//设计高度
document.body.clientWidth,
document.body.clientHeight,
FYGE.RENDERER_TYPE.WEBGL,
);
//监听窗口缩放,按需,一般移动端的不需要
window.addEventListener('resize', () => { stage.resize() });
//鼠标事件
var mouseEvent = stage.onMouseEvent.bind(stage);
canvas.addEventListener("touchstart", mouseEvent, false);
canvas.addEventListener('touchmove', mouseEvent, false);
canvas.addEventListener('touchend', mouseEvent, false);
//pc
canvas.addEventListener("mousedown", mouseEvent, false);
canvas.addEventListener('mousemove', mouseEvent, false);
canvas.addEventListener('mouseup', mouseEvent, false);
//stage初始化
stage.addEventListener(FYGE.Event.INIT_STAGE, async () => {
//场景
// var scene = stage.addChild(new DD("场景", 750, 1624))
// //父1
// var f1 = scene.addChild(new DD("父1", 400, 400))
// f1.position.set(175, 100);
// //子1
// f1.addChild(new DD("子1", 200, 200))
// .position.set(100, 100);
// //父2
// var f2 = scene.addChild(new DD("父2", 400, 400))
// f2.position.set(175, 600)
// //子2
// f2.addChild(new DD("子2", 200, 200))
// .position.set(100, 100);
// //父1要动
// FYGE.Tween.get(f1,{loop:true})
// .to({x:300}, 2000)
// .to({x:175}, 2000)
//好多图
for (var i = 0; i < 20000; i++) {
let a = stage.addChild(FYGE.Sprite.fromUrl("res/11.png"))
.addEventListener(FYGE.Event.ENTER_FRAME, () => {
a.rotation += 3
})
a.scale.set(0.4, 0.4)
a.anchorTexture.set(0.5, 0.5);
a.position.set(Math.random() * 750, Math.random() * 1334)
}
// var arr = [];
// for (var i = 0; i < 1; i++) {
// arr[i] = stage.addChild(FYGE.Sprite.fromUrl("res/img.png"))
// arr[i].position.set(120 * i, 500);
// arr[i].scale.set(0.5)
// }
// stage.addEventListener(FYGE.Event.ENTER_FRAME, () => {
// arr.forEach((a,i) => {
// a.x -= 5;
// if (a.x < -100) {
// a.x = arr[arr.length - 1].x + 1200;
// arr.splice(i,1);
// arr.push(a)
// }
// })
// })
// fly({x:50,y:800},{x:500,y:100},FYGE.Texture.fromUrl("res/img.png"),stage)
// function fly(start, end, texture, container) {
// let range = 200;
// let count = 10;
// while (count--) {
// let spr = container.addChild(new FYGE.Sprite(texture))
// spr.position.set(
// start.x + range * (Math.random() - 0.5),
// start.y + range * (Math.random() - 0.5)
// )
// //y方向匀速
// FYGE.Tween.get(spr)
// .to({ y: end.y }, 1000)
// FYGE.Tween.get(spr)
// .to({ x: end.x }, 1000, FYGE.Ease.quadIn)
// }
// }
}, this);
//循环
loop();
function loop() {
//Tween每帧刷新
FYGE.Tween.flush()
//舞台每帧刷新
stage.flush();
// FYGE.getRequestAnimationFrame()(loop);
requestAnimationFrame(loop)
}
})
//搞个文本加图片类
class DD extends FYGE.Container {
constructor(name, w, h) {
super();
this.addChild(new FYGE.Graphics())
.beginFill(Math.random() * 0xffffff)
.drawRect(0, 0, w, h)
.endFill();
var t = this.addChild(new FYGE.TextField())
t.text = name;
t.position.set(20, 20)
t.size = 50
t.fillColor = "#ff0000"
}
}
</script>
</html>
\ No newline at end of file
{ {
"name": "fyge", "name": "fyge",
"version": "2.0.22", "version": "2.0.23",
"description": "canvas渲染引擎", "description": "canvas渲染引擎",
"main": "./build/fyge.min.js", "main": "./build/fyge.min.js",
"types": "./build/types.d.ts", "types": "./build/types.d.ts",
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
"scripts": { "scripts": {
"declare": "node scripts/declare.js src/index.ts", "declare": "node scripts/declare.js src/index.ts",
"declare1": "node scripts/declare1.js src/index.ts", "declare1": "node scripts/declare1.js src/index.ts",
"declare2": "tsc -d --declarationDir types --emitDeclarationOnly",
"build": "webpack", "build": "webpack",
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack -w", "dev": "webpack -w",
......
...@@ -297,9 +297,22 @@ ...@@ -297,9 +297,22 @@
getCusShader添加参数shadow,parameters添加useShadow和shadowType,相应预处理宏修改,着色器修改 #ifdef USE_SHADOW', getCusShader添加参数shadow,parameters添加useShadow和shadowType,相应预处理宏修改,着色器修改 #ifdef USE_SHADOW',
新增着色器ShadowShader 新增着色器ShadowShader
2.0.23 display文件夹里的注释都整理了一边
删除DisplayObject的setParent方法,基本用不到,有用到的用addChild替换
Stage添加参数分辨率resolution,兼容老版不传的情况(外部设置canvas实际尺寸)
Stage onMouseEvent添加标志位,阻止默认事件,阻止冒泡事件
Stage添加方法addWebMouseEvent,不用在外面写鼠标事件,直接调用
Event删除ABORT,START,TIMER,TIMER_COMPLETE事件,添加BLUR,INPUT事件
EditableText的_prompt添加默认值,添加onblur和oninput事件触发
MovieClip修改原先方法updateMask为静态方法drawBezierShape
Bone添加shearX和shearY属性,因为原先的skewX对应-shearY,skewY对应shearX
SpineBoneAniTrack里的skewX相关修改成shearXY
Bone添加updateWorldTransformWith和appliedSelf方法,为了ik,后续考虑优化(现在涉及ik的子级都会多计算一次,考虑不用显示对象,尝试官方的方式)
Spine构造函数传参修改,只需要问题放在数据里了,纹理获取相关修改,clone方法修改
Spine添加ik约束
Spine的findSlot方法变成公共的,为了显示隐藏插槽,这样做不保险,后续考虑优化
新增IkConstraint
现在不改,索引数据过大时得用Uint32Array,同时开扩展gl.getExtension( "OES_element_index_uint" )和drawElements改参数类型为gl.UNSIGNED_INT 现在不改,索引数据过大时得用Uint32Array,同时开扩展gl.getExtension( "OES_element_index_uint" )和drawElements改参数类型为gl.UNSIGNED_INT
...@@ -311,6 +324,10 @@ ...@@ -311,6 +324,10 @@
检查spine变形动画切换不回默认 检查spine变形动画切换不回默认
spine.animationManager.showAni有闪烁,考虑调用下返回值的rectify
每个类的update方法的super.update(),注意触发循环帧的时序
FloatDisplay的updateStyle方法并不会在父级visible改变时修改,考虑如何解决 FloatDisplay的updateStyle方法并不会在父级visible改变时修改,考虑如何解决
3d的灯光应该遍历整个scene 3d的灯光应该遍历整个scene
......
...@@ -10,7 +10,9 @@ var inUrl = arg[0]; ...@@ -10,7 +10,9 @@ var inUrl = arg[0];
var img = fs.readFileSync(inUrl + ".png") var img = fs.readFileSync(inUrl + ".png")
var atlas = fs.readFileSync(inUrl + ".atlas") var atlas = fs.readFileSync(inUrl + ".atlas")
var json = fs.readFileSync(inUrl + ".json") // var json = fs.readFileSync(inUrl + ".json")
//为了能压缩格式化过的json
var json = Buffer.from(JSON.stringify(JSON.parse(fs.readFileSync(inUrl + ".json"))), "utf-8")
// console.log(img.byteLength) // console.log(img.byteLength)
// console.log(atlas.byteLength) // console.log(atlas.byteLength)
...@@ -60,7 +62,7 @@ function bytesToBinary(bytes) { ...@@ -60,7 +62,7 @@ function bytesToBinary(bytes) {
function toBuffer(ab) { function toBuffer(ab) {
// var buf = new Buffer(ab.byteLength); // var buf = new Buffer(ab.byteLength);
var buf = Buffer.alloc(ab.byteLength); var buf = Buffer.alloc(ab.byteLength);
var view = new Uint8Array(ab); var view = new Uint8Array(ab);
for (var i = 0; i < buf.length; ++i) { for (var i = 0; i < buf.length; ++i) {
buf[i] = view[i]; buf[i] = view[i];
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* @name VERSION * @name VERSION
* @type {string} * @type {string}
*/ */
export const VERSION = "2.0.22"; export const VERSION = "2.0.23";
/** /**
......
...@@ -24,7 +24,7 @@ export default class Container extends DisplayObject { ...@@ -24,7 +24,7 @@ export default class Container extends DisplayObject {
children: DisplayObject[]; children: DisplayObject[];
/** /**
* 特殊用处 * 特殊用处,部分继承可能会用,暂时没地方用到,考虑废弃
* 缓存的Container的updateTransform * 缓存的Container的updateTransform
*/ */
containerUpdateTransform; containerUpdateTransform;
...@@ -36,16 +36,15 @@ export default class Container extends DisplayObject { ...@@ -36,16 +36,15 @@ export default class Container extends DisplayObject {
} }
/** /**
* children改变时 * children改变时触发,暂时没地方用到,考虑废弃
* @private * @param {number} index
*/ */
onChildrenChange(index) { onChildrenChange(index:number) {
/* empty */
//子类需要时重写 //子类需要时重写
} }
/** /**
* 添加child * 添加child,在所有子级的最上层
* @param {DisplayObject} child * @param {DisplayObject} child
* @return {DisplayObject} * @return {DisplayObject}
*/ */
...@@ -65,9 +64,9 @@ export default class Container extends DisplayObject { ...@@ -65,9 +64,9 @@ export default class Container extends DisplayObject {
/** /**
* 在相应index处添加child * 在相应index处添加child
* @param {DisplayObject} child - The child to add * @param {DisplayObject} child - 被添加的子级
* @param {number} index - The index to place the child in * @param {number} index - 需要放置的索引位置,指已存在子级的索引,一般用于往子级之间插入
* @return {DisplayObject} The child that was added. * @return {DisplayObject} 返回自身
*/ */
addChildAt<T extends DisplayObject>(child: T, index: number): T { addChildAt<T extends DisplayObject>(child: T, index: number): T {
if (!child) return; if (!child) return;
...@@ -118,8 +117,8 @@ export default class Container extends DisplayObject { ...@@ -118,8 +117,8 @@ export default class Container extends DisplayObject {
/** /**
* 只用于交换索引 * 只用于交换索引
* @param {DisplayObject} child - First display object to swap * @param {DisplayObject} child
* @param {DisplayObject} child2 - Second display object to swap * @param {DisplayObject} child2
*/ */
swapChildren(child1: DisplayObject, child2: DisplayObject) { swapChildren(child1: DisplayObject, child2: DisplayObject) {
if (child1 === child2) { if (child1 === child2) {
...@@ -154,8 +153,8 @@ export default class Container extends DisplayObject { ...@@ -154,8 +153,8 @@ export default class Container extends DisplayObject {
/** /**
* 获取child的层级索引index * 获取child的层级索引index
* @param {DisplayObject} child - The DisplayObject instance to identify * @param {DisplayObject} child - 需要获取索引的子级
* @return {number} The index position of the child display object to identify * @return {number} children内的索引
*/ */
getChildIndex(child: DisplayObject): number { getChildIndex(child: DisplayObject): number {
const index = this.children.indexOf(child); const index = this.children.indexOf(child);
...@@ -167,7 +166,7 @@ export default class Container extends DisplayObject { ...@@ -167,7 +166,7 @@ export default class Container extends DisplayObject {
} }
/** /**
* 设置child的层级 * 设置child的层级索引
* @param {DisplayObject} child * @param {DisplayObject} child
* @param {number} index * @param {number} index
*/ */
...@@ -176,9 +175,9 @@ export default class Container extends DisplayObject { ...@@ -176,9 +175,9 @@ export default class Container extends DisplayObject {
} }
/** /**
* Returns the child at the specified index * 根据索引获取子级对象
* @param {number} index - The index to get the child at * @param {number} index
* @return {DisplayObject} The child at the given index, if any. * @return {DisplayObject}
*/ */
getChildAt(index: number): DisplayObject { getChildAt(index: number): DisplayObject {
if (index < 0 || index >= this.children.length) { if (index < 0 || index >= this.children.length) {
...@@ -231,9 +230,9 @@ export default class Container extends DisplayObject { ...@@ -231,9 +230,9 @@ export default class Container extends DisplayObject {
} }
/** /**
* 在index处移除child * 在index索引处移除子级对象
* @param {number} index - The index to get the child from * @param {number} index
* @return {DisplayObject} The child that was removed. * @return {DisplayObject} 移除的子级对象
*/ */
removeChildAt(index: number): DisplayObject { removeChildAt(index: number): DisplayObject {
let s = this; let s = this;
...@@ -280,9 +279,9 @@ export default class Container extends DisplayObject { ...@@ -280,9 +279,9 @@ export default class Container extends DisplayObject {
} }
/** /**
* 通过索引批量移除child * 通过索引批量移除child
* @param {number} [beginIndex=0] * @param {number} [beginIndex=0] 开始索引,包括自己
* @param {number} [endIndex=this.children.length] * @param {number} [endIndex=this.children.length] 结束索引,不包括自己
* @returns {DisplayObject[]} List of removed children * @returns {DisplayObject[]} 移除的所有子级数组
*/ */
removeChildrenAt(beginIndex: number = 0, endIndex: number = this.children.length): DisplayObject[] { removeChildrenAt(beginIndex: number = 0, endIndex: number = this.children.length): DisplayObject[] {
const begin = beginIndex; const begin = beginIndex;
...@@ -296,12 +295,12 @@ export default class Container extends DisplayObject { ...@@ -296,12 +295,12 @@ export default class Container extends DisplayObject {
return []; return [];
} }
throw new RangeError('removeChildren: numeric values are outside the acceptable range.'); throw new RangeError('removeChildren: 移除范围有误');
} }
/** /**
* 类比splice方法 * 类比数组的splice方法,但是没有第三个参数,不能添加
* @param beginIndex * @param beginIndex 开始索引
* @param count * @param count 移除数量
*/ */
spliceChildren<T extends DisplayObject>(beginIndex?: number, count?: number): T[] { spliceChildren<T extends DisplayObject>(beginIndex?: number, count?: number): T[] {
let removed = this.children.splice(beginIndex, count); let removed = this.children.splice(beginIndex, count);
...@@ -336,7 +335,7 @@ export default class Container extends DisplayObject { ...@@ -336,7 +335,7 @@ export default class Container extends DisplayObject {
//children遍历计算 //children遍历计算
for (let i = 0, j = this.children.length; i < j; ++i) { for (let i = 0, j = this.children.length; i < j; ++i) {
const child = this.children[i]; const child = this.children[i];
if (child.visible) { if (child.visible) {//为了优化性能,但是会出现,不显示的对象,获取到的位置等信息是错误的
child.updateTransform(); child.updateTransform();
} }
} }
...@@ -375,7 +374,7 @@ export default class Container extends DisplayObject { ...@@ -375,7 +374,7 @@ export default class Container extends DisplayObject {
} }
Rectangle.createFromRects(this._bounds, child._bounds); Rectangle.createFromRects(this._bounds, child._bounds);
} }
//到时处理mask和filterArea //到时处理filterArea
else if (child.filterArea) { else if (child.filterArea) {
} }
...@@ -421,7 +420,7 @@ export default class Container extends DisplayObject { ...@@ -421,7 +420,7 @@ export default class Container extends DisplayObject {
/** /**
* webgl渲染 * webgl渲染
* @param {WebglRenderer} renderer - The renderer * @param {WebglRenderer} renderer - 渲染器
*/ */
renderWebGL(renderer: WebglRenderer) { renderWebGL(renderer: WebglRenderer) {
//不可见,全局透明度为0,或者 不渲染,直接return //不可见,全局透明度为0,或者 不渲染,直接return
...@@ -446,7 +445,7 @@ export default class Container extends DisplayObject { ...@@ -446,7 +445,7 @@ export default class Container extends DisplayObject {
* 高级渲染方法 * 高级渲染方法
* *
* @private * @private
* @param {WebGLRenderer} renderer - The renderer * @param {WebGLRenderer} renderer - 渲染器
*/ */
private renderAdvancedWebGL(renderer: WebglRenderer) { private renderAdvancedWebGL(renderer: WebglRenderer) {
//之前的批处理刷掉先 //之前的批处理刷掉先
...@@ -494,9 +493,9 @@ export default class Container extends DisplayObject { ...@@ -494,9 +493,9 @@ export default class Container extends DisplayObject {
} }
/** /**
* 自身渲染方式 * 自身webgl渲染方式
* @private * @private
* @param {WebglRenderer} renderer - The renderer * @param {WebglRenderer} renderer - 渲染器
*/ */
protected _renderWebGL(renderer: WebglRenderer) { protected _renderWebGL(renderer: WebglRenderer) {
//自身绘制方法 //自身绘制方法
...@@ -504,7 +503,7 @@ export default class Container extends DisplayObject { ...@@ -504,7 +503,7 @@ export default class Container extends DisplayObject {
/** /**
* canvas渲染方式 * canvas渲染方式
* @param {CanvasRenderer} renderer - The renderer * @param {CanvasRenderer} renderer - 渲染器
*/ */
renderCanvas(renderer: CanvasRenderer) { renderCanvas(renderer: CanvasRenderer) {
if (!this.visible || this._worldAlpha <= 0 || !this.renderable) { if (!this.visible || this._worldAlpha <= 0 || !this.renderable) {
...@@ -526,8 +525,7 @@ export default class Container extends DisplayObject { ...@@ -526,8 +525,7 @@ export default class Container extends DisplayObject {
} }
/** /**
* 自身渲染方法 * 自身canvas渲染方法
*
* @private * @private
* @param {CanvasRenderer} renderer - The renderer * @param {CanvasRenderer} renderer - The renderer
*/ */
...@@ -536,7 +534,7 @@ export default class Container extends DisplayObject { ...@@ -536,7 +534,7 @@ export default class Container extends DisplayObject {
} }
/** /**
* 更新方法 * 更新方法,注意别覆盖,子类可继承修改
*/ */
update() { update() {
if (!this.visible) return; if (!this.visible) return;
...@@ -570,7 +568,7 @@ export default class Container extends DisplayObject { ...@@ -570,7 +568,7 @@ export default class Container extends DisplayObject {
} }
/** /**
* * 销毁方法,也会销毁子级
*/ */
destroy() { destroy() {
let s = this; let s = this;
...@@ -583,8 +581,8 @@ export default class Container extends DisplayObject { ...@@ -583,8 +581,8 @@ export default class Container extends DisplayObject {
} }
/** /**
* 一般用于获取宽高并设置 * 一般用于获取宽高并设置,会修改缩放
* 包括子级的,容器的尽量少用,子类可重写 * 包括子级的,容器Container的尽量少用,子类可重写
* @member {number} * @member {number}
*/ */
get width() { get width() {
......
...@@ -56,7 +56,10 @@ export class DisplayObject extends EventDispatcher { ...@@ -56,7 +56,10 @@ export class DisplayObject extends EventDispatcher {
/** /**
* 用于计算世界bounds,包括自身和子级,一般只在获取宽高时使用,变形后的 * 用于计算世界bounds,包括自身和子级,一般只在获取宽高时使用,变形后的
*/ */
protected _bounds: Rectangle protected _bounds: Rectangle;
/**
* 包围盒有修改用_boundsID++
*/
protected _boundsID: number; protected _boundsID: number;
protected _lastBoundsID: number; protected _lastBoundsID: number;
/** /**
...@@ -220,12 +223,10 @@ export class DisplayObject extends EventDispatcher { ...@@ -220,12 +223,10 @@ export class DisplayObject extends EventDispatcher {
} }
/** /**
* 获取全局的bounds,变形后的 * 获取全局的包围盒,变形后的
* @param {boolean} skipUpdate - setting to true will stop the transforms of the scene graph from * @param {boolean} skipUpdate - 是否递归至父级的更新,默认false
* being updated. This means the calculation returned MAY be out of date BUT will give you a * @param {Rectangle} rect - 可选,返回的包围盒数据,不传会用固定临时对象
* nice performance boost * @return {Rectangle} 包围盒
* @param {Rectangle} rect - Optional rectangle to store the result of the bounds calculation
* @return {Rectangle} the rectangular bounding area
*/ */
getBounds(skipUpdate: boolean = false, rect: Rectangle = DisplayObject.temBounds): Rectangle { getBounds(skipUpdate: boolean = false, rect: Rectangle = DisplayObject.temBounds): Rectangle {
//先把父级的都变换 //先把父级的都变换
...@@ -249,8 +250,8 @@ export class DisplayObject extends EventDispatcher { ...@@ -249,8 +250,8 @@ export class DisplayObject extends EventDispatcher {
/** /**
* 以自身为世界坐标系的本地包围盒 * 以自身为世界坐标系的本地包围盒
* @param {Rectangle} [rect] - Optional rectangle to store the result of the bounds calculation * @param {Rectangle} rect - 可选,返回的包围盒数据,不传会用固定临时对象
* @return {Rectangle} the rectangular bounding area * @return {Rectangle} 包围盒
*/ */
getLocalBounds(rect: Rectangle = DisplayObject.temBounds): Rectangle { getLocalBounds(rect: Rectangle = DisplayObject.temBounds): Rectangle {
const transformRef = this.transform; const transformRef = this.transform;
...@@ -331,7 +332,7 @@ export class DisplayObject extends EventDispatcher { ...@@ -331,7 +332,7 @@ export class DisplayObject extends EventDispatcher {
/** /**
* webgl渲染 * webgl渲染
* @param {WebGLRenderer} renderer - The renderer * @param {WebGLRenderer} renderer - 渲染器
*/ */
renderWebGL(renderer: any) { renderWebGL(renderer: any) {
//子类重写 //子类重写
...@@ -339,37 +340,24 @@ export class DisplayObject extends EventDispatcher { ...@@ -339,37 +340,24 @@ export class DisplayObject extends EventDispatcher {
/** /**
* canvas渲染 * canvas渲染
* @param {CanvasRenderer} renderer - The renderer * @param {CanvasRenderer} renderer - 渲染器
*/ */
renderCanvas(renderer: any) { renderCanvas(renderer: any) {
//子类重写 //子类重写
} }
/** /**
* 设置父级 * 根据常规属性,设置矩阵属性,挺少用,自己赋值也完全一样,考虑废弃
* @param {Container} container - The Container to add this DisplayObject to * @param {number} [x=0] - 位置x
* @return {Container} The Container that this DisplayObject was added to * @param {number} [y=0] - 位置y
*/ * @param {number} [scaleX=1] - 缩放x
setParent(container: any): any { * @param {number} [scaleY=1] - 缩放y
if (!container || !container.addChild) { * @param {number} [rotation=0] - 旋转(角度制)
throw new Error('setParent: Argument must be a Container'); * @param {number} [skewX=0] - 斜切x(弧度制)
} * @param {number} [skewY=0] - 斜切y(弧度制)
container.addChild(this); * @param {number} [anchorX=0] - 锚点x
return container; * @param {number} [anchorY=0] - 锚点y
} * @return {DisplayObject} 返回自身
/**
*根据常规属性 设置矩阵属性,弧度制
* @param {number} [x=0] - The X position
* @param {number} [y=0] - The Y position
* @param {number} [scaleX=1] - The X scale value
* @param {number} [scaleY=1] - The Y scale value
* @param {number} [rotation=0] - The rotation
* @param {number} [skewX=0] - The X skew value
* @param {number} [skewY=0] - The Y skew value
* @param {number} [anchorX=0] - The X anchor value
* @param {number} [anchorY=0] - The Y anchor value
* @return {DisplayObject} The DisplayObject instance
*/ */
setTransform( setTransform(
x: number = 0, x: number = 0,
...@@ -424,29 +412,42 @@ export class DisplayObject extends EventDispatcher { ...@@ -424,29 +412,42 @@ export class DisplayObject extends EventDispatcher {
} }
/**
* 获取透明度,0到1
*/
get alpha(): number { get alpha(): number {
return this._alpha return this._alpha
} }
/**
* 设置透明度,0到1
*/
set alpha(value: number) { set alpha(value: number) {
if (this._alpha != value) { if (this._alpha != value) {
this._alpha = value this._alpha = value
//是否有必要设置_worldAlpha是否需要更新,一个乘法基本不耗性能 //是否有必要设置_worldAlpha是否需要更新,一个乘法基本不耗性能
} }
} }
/**
* 获取位置x
*/
get x(): number { get x(): number {
return this.position.x; return this.position.x;
} }
/**
* 设置位置x
*/
set x(value: number) { set x(value: number) {
this.transform.position.x = value; this.transform.position.x = value;
} }
/**
* 获取位置y
*/
get y(): number { get y(): number {
return this.position.y; return this.position.y;
} }
/**
* 设置位置y
*/
set y(value: number) { set y(value: number) {
this.transform.position.y = value; this.transform.position.y = value;
} }
...@@ -481,6 +482,7 @@ export class DisplayObject extends EventDispatcher { ...@@ -481,6 +482,7 @@ export class DisplayObject extends EventDispatcher {
/** /**
* 设置位置对象 * 设置位置对象
* 传值用于copy,并非赋值,要求传值存在x和y字段
*/ */
set position(value) { set position(value) {
this.transform.position.copy(value); this.transform.position.copy(value);
...@@ -496,24 +498,33 @@ export class DisplayObject extends EventDispatcher { ...@@ -496,24 +498,33 @@ export class DisplayObject extends EventDispatcher {
/** /**
* 设置缩放对象 * 设置缩放对象
* 传值用于copy,并非赋值,要求传值存在x和y字段
*/ */
set scale(value) { set scale(value) {
this.transform.scale.copy(value); this.transform.scale.copy(value);
} }
/**
get scaleX() { * 获取缩放x
*/
get scaleX(): number {
return this.transform.scale.x; return this.transform.scale.x;
} }
/**
set scaleX(value) { * 设置缩放x
*/
set scaleX(value: number) {
this.transform.scale.x = value; this.transform.scale.x = value;
} }
/**
get scaleY() { * 获取缩放y
*/
get scaleY(): number {
return this.transform.scale.y; return this.transform.scale.y;
} }
/**
set scaleY(value) { * 设置缩放y
*/
set scaleY(value: number) {
this.transform.scale.y = value; this.transform.scale.y = value;
} }
...@@ -524,24 +535,35 @@ export class DisplayObject extends EventDispatcher { ...@@ -524,24 +535,35 @@ export class DisplayObject extends EventDispatcher {
get anchor(): ObservablePoint { get anchor(): ObservablePoint {
return this.transform.anchor; return this.transform.anchor;
} }
/**
* 设置锚点对象
* 传值用于copy,并非赋值,要求传值存在x和y字段
*/
set anchor(value) { set anchor(value) {
this.transform.anchor.copy(value); this.transform.anchor.copy(value);
} }
/**
get anchorX() { * 获取锚点x
*/
get anchorX(): number {
return this.transform.anchor.x; return this.transform.anchor.x;
} }
/**
set anchorX(value) { * 设置锚点x
*/
set anchorX(value: number) {
this.transform.anchor.x = value; this.transform.anchor.x = value;
} }
/**
get anchorY() { * 获取锚点y
*/
get anchorY(): number {
return this.transform.anchor.y; return this.transform.anchor.y;
} }
/**
set anchorY(value) { * 设置锚点y
*/
set anchorY(value: number) {
this.transform.anchor.y = value; this.transform.anchor.y = value;
} }
...@@ -552,33 +574,36 @@ export class DisplayObject extends EventDispatcher { ...@@ -552,33 +574,36 @@ export class DisplayObject extends EventDispatcher {
get skew(): ObservablePoint { get skew(): ObservablePoint {
return this.transform.skew; return this.transform.skew;
} }
/**
* 设置斜切对象
* 传值用于copy,并非赋值,要求传值存在x和y字段
*/
set skew(value) { set skew(value) {
this.transform.skew.copy(value); this.transform.skew.copy(value);
} }
/** /**
* 角度制 * 获取斜切x,角度制
*/ */
get skewX() { get skewX(): number {
return this.transform.skew.x * RAD_TO_DEG; return this.transform.skew.x * RAD_TO_DEG;
} }
/** /**
* 角度制 * 设置斜切x,角度制
*/ */
set skewX(value) { set skewX(value: number) {
this.transform.skew.x = value * DEG_TO_RAD; this.transform.skew.x = value * DEG_TO_RAD;
} }
/** /**
* 角度制 * 获取斜切y,角度制
*/ */
get skewY() { get skewY(): number {
return this.transform.skew.y * RAD_TO_DEG; return this.transform.skew.y * RAD_TO_DEG;
} }
/** /**
* 角度制 * 设置斜切y,角度制
*/ */
set skewY(value) { set skewY(value: number) {
this.transform.skew.y = value * DEG_TO_RAD; this.transform.skew.y = value * DEG_TO_RAD;
} }
/** /**
...@@ -590,7 +615,7 @@ export class DisplayObject extends EventDispatcher { ...@@ -590,7 +615,7 @@ export class DisplayObject extends EventDispatcher {
} }
/** /**
* 角度制 * 设置旋转,角度制
*/ */
set rotation(value: number) { set rotation(value: number) {
this.transform.rotation = value * DEG_TO_RAD; this.transform.rotation = value * DEG_TO_RAD;
...@@ -669,10 +694,9 @@ export class DisplayObject extends EventDispatcher { ...@@ -669,10 +694,9 @@ export class DisplayObject extends EventDispatcher {
/** /**
* 更新方法,帧循环的监听事件放在这 * 更新方法,帧循环的监听事件是放在这派发的
*/ */
public update() { public update() {
//监听的 //监听的
if (this.hasEventListener(Event.ENTER_FRAME)) { if (this.hasEventListener(Event.ENTER_FRAME)) {
this.dispatchEvent(Event.ENTER_FRAME); this.dispatchEvent(Event.ENTER_FRAME);
...@@ -681,7 +705,7 @@ export class DisplayObject extends EventDispatcher { ...@@ -681,7 +705,7 @@ export class DisplayObject extends EventDispatcher {
} }
/** /**
* 比用call性能好 * 比用call性能好
* 不会被子覆盖,部分地方使用 * 不会被子覆盖,部分地方使用
*/ */
DisplayObject.prototype.displayObjectUpdateTransform = DisplayObject.prototype.updateTransform; DisplayObject.prototype.displayObjectUpdateTransform = DisplayObject.prototype.updateTransform;
......
...@@ -173,6 +173,7 @@ export class FloatDisplay extends DisplayObject { ...@@ -173,6 +173,7 @@ export class FloatDisplay extends DisplayObject {
} }
/** /**
* 考虑放到stage里,因为父级的visible修改不会调用updateStyle
* @method updateStyle * @method updateStyle
* @public * @public
* @since 1.1.4 * @since 1.1.4
......
...@@ -118,7 +118,6 @@ export default class Sprite extends Container { ...@@ -118,7 +118,6 @@ export default class Sprite extends Container {
this._uvs = null; this._uvs = null;
// call texture setter
this.texture = texture || Texture.EMPTY; this.texture = texture || Texture.EMPTY;
this._vertexData = new Float32Array(8); this._vertexData = new Float32Array(8);
...@@ -141,7 +140,6 @@ export default class Sprite extends Container { ...@@ -141,7 +140,6 @@ export default class Sprite extends Container {
/** /**
* texture更新时触发 * texture更新时触发
*
* @private * @private
*/ */
protected _onTextureUpdate() { protected _onTextureUpdate() {
...@@ -195,7 +193,7 @@ export default class Sprite extends Container { ...@@ -195,7 +193,7 @@ export default class Sprite extends Container {
* 01——23 * 01——23
* | | * | |
* 67——45 * 67——45
* calculates worldTransform * vertices, store it in vertexData * 计算全局的顶点数据
*/ */
calculateVertices() { calculateVertices() {
if (this._transformID === this.transform._worldID && this._textureID === this._texture._updateID) { if (this._transformID === this.transform._worldID && this._textureID === this._texture._updateID) {
...@@ -205,7 +203,6 @@ export default class Sprite extends Container { ...@@ -205,7 +203,6 @@ export default class Sprite extends Container {
this._transformID = this.transform._worldID; this._transformID = this.transform._worldID;
this._textureID = this._texture._updateID; this._textureID = this._texture._updateID;
// set the vertex data
const texture = this._texture; const texture = this._texture;
const wt = this.transform.worldMatrix; const wt = this.transform.worldMatrix;
const a = wt.a; const a = wt.a;
...@@ -260,8 +257,8 @@ export default class Sprite extends Container { ...@@ -260,8 +257,8 @@ export default class Sprite extends Container {
} }
/** /**
* calculates worldTransform * vertices for a non texture with a trim. store it in vertexTrimmedData * 用于trim过的纹理,计算真实顶点位置,
* This is used to ensure that the true width and height of a trimmed texture is respected * 因为trim会裁切边缘透明像素,所以直接用orig的尺寸
*/ */
calculateTrimmedVertices() { calculateTrimmedVertices() {
if (!this._vertexTrimmedData) { if (!this._vertexTrimmedData) {
...@@ -417,29 +414,33 @@ export default class Sprite extends Container { ...@@ -417,29 +414,33 @@ export default class Sprite extends Container {
/** /**
* 重写Container父类 * 重写Container父类
* texture的宽度和缩放乘积 * 获取texture的宽度和缩放乘积
* @member {number} * @member {number}
*/ */
get width() { get width(): number {
return Math.abs(this.scale.x) * this._texture.orig.width; return Math.abs(this.scale.x) * this._texture.orig.width;
} }
/**
set width(value) { * 重写父级
* 根据纹理宽度设置自身缩放x到设置的数值
*/
set width(value: number) {
const s = sign(this.scale.x) || 1; const s = sign(this.scale.x) || 1;
this.scale.x = s * value / this._texture.orig.width; this.scale.x = s * value / this._texture.orig.width;
this._width = value; this._width = value;
} }
/** /**
* texture的高度和缩放乘积 * 获取texture的高度和缩放乘积
* @member {number} * @member {number}
*/ */
get height() { get height(): number {
return Math.abs(this.scale.y) * this._texture.orig.height; return Math.abs(this.scale.y) * this._texture.orig.height;
} }
/**
set height(value) { * 根据纹理高度设置自身缩放y到设置的数值
*/
set height(value: number) {
const s = sign(this.scale.y) || 1; const s = sign(this.scale.y) || 1;
this.scale.y = s * value / this._texture.orig.height; this.scale.y = s * value / this._texture.orig.height;
this._height = value; this._height = value;
...@@ -452,20 +453,25 @@ export default class Sprite extends Container { ...@@ -452,20 +453,25 @@ export default class Sprite extends Container {
get anchorTexture() { get anchorTexture() {
return this._anchorTexture; return this._anchorTexture;
} }
/**
* 设置贴图锚点,copy方法,只要value存在x、y字段就行
*/
set anchorTexture(value: any) { set anchorTexture(value: any) {
this._anchorTexture.copy(value); this._anchorTexture.copy(value);
} }
/** /**
* 获取纹理
* @member {Texture} * @member {Texture}
*/ */
get texture() { get texture(): Texture {
return this._texture === Texture.EMPTY ? null : this._texture;//考虑是否返回null return this._texture === Texture.EMPTY ? null : this._texture;//考虑是否返回null
} }
/**
set texture(value) { * 设置纹理
*/
set texture(value: Texture) {
if (this._texture === value) { if (this._texture === value) {
return; return;
} }
...@@ -492,11 +498,16 @@ export default class Sprite extends Container { ...@@ -492,11 +498,16 @@ export default class Sprite extends Container {
this.updateLocalBoundsSelf(); this.updateLocalBoundsSelf();
} }
} }
/**
get tint() { * 获取调色
*/
get tint(): number {
return this._tint; return this._tint;
} }
set tint(value) { /**
* 设置调色
*/
set tint(value: number) {
if (value === this._tint) return; if (value === this._tint) return;
this._tint = value; this._tint = value;
this._tintRGB = (value >> 16) + (value & 0xff00) + ((value & 0xff) << 16); this._tintRGB = (value >> 16) + (value & 0xff00) + ((value & 0xff) << 16);
...@@ -505,7 +516,8 @@ export default class Sprite extends Container { ...@@ -505,7 +516,8 @@ export default class Sprite extends Container {
//一些静态类方法 //一些静态类方法
/** /**
* 网络图片 * 网络图片
* @param url * @param url 链接
* @return Sprite实例
*/ */
static fromUrl(url: string): Sprite { static fromUrl(url: string): Sprite {
return new Sprite(Texture.fromUrl(url)); return new Sprite(Texture.fromUrl(url));
......
...@@ -160,8 +160,7 @@ export class Stage extends Container { ...@@ -160,8 +160,7 @@ export class Stage extends Container {
*/ */
private _stageCenter: boolean; private _stageCenter: boolean;
/** /**
* canvas的实际宽高及显示宽高外部自己设定,stage内部不对尺寸做任何修改 * 建立舞台
* 且需要根据实际尺寸和显示尺寸确定dpi
* @param canvas canvas标签 * @param canvas canvas标签
* @param desWidth 舞台设计宽 * @param desWidth 舞台设计宽
* @param desHeight 舞台设计高 * @param desHeight 舞台设计高
...@@ -170,6 +169,7 @@ export class Stage extends Container { ...@@ -170,6 +169,7 @@ export class Stage extends Container {
* @param renderType 渲染类型,默认canvas * @param renderType 渲染类型,默认canvas
* @param stageCenter 舞台是否根据设计尺寸居中,默认false(左上角置顶) * @param stageCenter 舞台是否根据设计尺寸居中,默认false(左上角置顶)
* @param fixedHeight 是否定高,默认false(定宽) * @param fixedHeight 是否定高,默认false(定宽)
* @param resolution 分辨率,一般传设备的devicePixelRatio,不传意味着外部自行处理了canvas的实际宽高及显示宽高
*/ */
public constructor( public constructor(
canvas: HTMLCanvasElement, canvas: HTMLCanvasElement,
...@@ -179,7 +179,8 @@ export class Stage extends Container { ...@@ -179,7 +179,8 @@ export class Stage extends Container {
divHeight: number, divHeight: number,
renderType: RENDERER_TYPE = RENDERER_TYPE.CANVAS, renderType: RENDERER_TYPE = RENDERER_TYPE.CANVAS,
stageCenter: boolean = false, stageCenter: boolean = false,
fixedHeight: boolean = false fixedHeight: boolean = false,
resolution?: number
) { ) {
super(); super();
this.canvas = canvas; this.canvas = canvas;
...@@ -193,6 +194,24 @@ export class Stage extends Container { ...@@ -193,6 +194,24 @@ export class Stage extends Container {
s.divWidth = divWidth; s.divWidth = divWidth;
s.divHeight = divHeight; s.divHeight = divHeight;
if (!resolution) {//为了兼容以前的活动,以后删了
//以前的活动外部设置了canvas的实际尺寸和显示尺寸
console.warn("尝试设置分辨率,内部会根据分辨率设置画布的实际尺寸");
//这里设置_dpi
s._dpi = canvas.width / divWidth;
} else {
//canvas实际尺寸处理
s._dpi = resolution;
var cWidth = divWidth * resolution, cHeight = divHeight * resolution;
if (getEnv() == "tb") {//淘宝小程序环境有个白边,所以加点像素
cWidth += resolution;
cHeight += resolution;
}
canvas.width = cWidth;
canvas.height = cHeight;
}
// console.log("%c ", "background: url(http://5b0988e595225.cdn.sohucs.com/images/20180315/d41842ad9b5443d3854a480ea49f3b09.gif) no-repeat center;padding-left:80px;padding-bottom: 80px;border-radius:50%;") // console.log("%c ", "background: url(http://5b0988e595225.cdn.sohucs.com/images/20180315/d41842ad9b5443d3854a480ea49f3b09.gif) no-repeat center;padding-left:80px;padding-bottom: 80px;border-radius:50%;")
//打印个版本号 //打印个版本号
console.log( console.log(
...@@ -237,7 +256,7 @@ export class Stage extends Container { ...@@ -237,7 +256,7 @@ export class Stage extends Container {
//到时修改这个放到上面,因为渲染器也用到了canvas的尺寸, //到时修改这个放到上面,因为渲染器也用到了canvas的尺寸,
//注意淘宝小程序环境必须先设置canvas的尺寸再getContext,类似CanvasRenderTarget构造函数里的问题 //注意淘宝小程序环境必须先设置canvas的尺寸再getContext,类似CanvasRenderTarget构造函数里的问题
//分辨率, //分辨率,
s._dpi = canvas.width / divWidth; // s._dpi = canvas.width / divWidth;//这里不需要了
s._stageCenter = stageCenter; s._stageCenter = stageCenter;
s._scaleMode = fixedHeight ? "fixedHeight" : "fixedWidth"; s._scaleMode = fixedHeight ? "fixedHeight" : "fixedWidth";
//设置缩放及视窗 //设置缩放及视窗
...@@ -389,11 +408,19 @@ export class Stage extends Container { ...@@ -389,11 +408,19 @@ export class Stage extends Container {
touchmove: "onMouseMove", touchmove: "onMouseMove",
touchend: "onMouseUp", touchend: "onMouseUp",
//tbMini //tbMini
touchStart: "onMouseDown",//小程序返回的时间名是驼峰的 touchStart: "onMouseDown",//小程序返回的事件名是驼峰的
touchMove: "onMouseMove", touchMove: "onMouseMove",
touchEnd: "onMouseUp" touchEnd: "onMouseUp"
}; };
/**
* 舞台的鼠标事件是否要阻止默认事件,默认false
* 对于同时写了监听pc和移动端的,
*/
public webMouseEventPreventDefault: boolean;
/**
* 舞台的鼠标事件是否要阻止事件冒泡,默认false
*/
public webMouseEventStopPropagation: boolean;
/** /**
* 无多指,无拖动 * 无多指,无拖动
* @method onMouseEvent * @method onMouseEvent
...@@ -401,8 +428,11 @@ export class Stage extends Container { ...@@ -401,8 +428,11 @@ export class Stage extends Container {
* @private * @private
*/ */
onMouseEvent(e: any): void { onMouseEvent(e: any): void {
//@ts-ignore //如果是web环境,且设置了阻止默认事件
if (getEnv() == "web") e.preventDefault(); if (getEnv() == "web") {
if (this.webMouseEventPreventDefault) e.preventDefault();
if (this.webMouseEventStopPropagation) e.stopPropagation();
}
let s: Stage = this; let s: Stage = this;
//检查mouse或touch事件是否有,如果有的话,就触发事件函数 //检查mouse或touch事件是否有,如果有的话,就触发事件函数
if (EventDispatcher._totalMEC > 0) { if (EventDispatcher._totalMEC > 0) {
...@@ -629,7 +659,29 @@ export class Stage extends Container { ...@@ -629,7 +659,29 @@ export class Stage extends Container {
} }
} }
}; };
/**
* 给舞台绑定canvas标签的鼠标代理事件(web环境下需要显示对象的鼠标事件时调用)
* 自行调用,内部不主动调用,因为比如淘宝小程序环境方式不一致,需要用onMouseEvent
*/
addWebMouseEvent() {
//非网页环境直接return
if (getEnv() !== "web") return;
var canvas = this.canvas;
var mouseEvent = this.onMouseEvent.bind(this);
if (osType == "pc") {
canvas.addEventListener("mousedown", mouseEvent, false);
canvas.addEventListener('mousemove', mouseEvent, false);
canvas.addEventListener('mouseup', mouseEvent, false);
} else {
canvas.addEventListener("touchstart", mouseEvent, false);
canvas.addEventListener('touchmove', mouseEvent, false);
canvas.addEventListener('touchend', mouseEvent, false);
}
}
/**
* 直接修改了,用视窗,
* 一般用于滤镜等等,对于舞台,超出viewPort的肯定不显示,没必要测量(后续考虑也测量,万一测量出的更小呢)
*/
public getBounds(): Rectangle { public getBounds(): Rectangle {
return this.viewRect; return this.viewRect;
} }
......
...@@ -142,43 +142,25 @@ export class Event extends HashObject { ...@@ -142,43 +142,25 @@ export class Event extends HashObject {
*/ */
public static ERROR: string = "onError"; public static ERROR: string = "onError";
/** /**
* 中断事件 * 输入框失去焦点事件
* @Event * @Event
* @property ABORT * @property BLUR
* @type {string} * @type {string}
* @static * @static
* @public * @public
* @since 1.0.0 * @since 1.0.0
*/ */
public static ABORT: string = "onAbort"; public static BLUR: string = "onBlur";
/** /**
* 开始事件 * 输入框输入事件
* @Event * @Event
* @property START * @property INPUT
* @type {string} * @type {string}
* @static * @static
* @public * @public
* @since 1.0.0 * @since 1.0.0
*/ */
public static START: string = "onStart"; public static INPUT: string = "onInput";
/**
* 定时器触发事件
* @property TIMER
* @static
* @since 1.0.9
* @public
* @type {string}
*/
public static TIMER: string = "onTimer";
/**
* 定时器完成事件
* @property TIMER_COMPLETE
* @since 1.0.9
* @static
* @public
* @type {string}
*/
public static TIMER_COMPLETE: string = "onTimerComplete";
/** /**
* 事件类型名 * 事件类型名
* @property type * @property type
...@@ -220,6 +202,7 @@ export class Event extends HashObject { ...@@ -220,6 +202,7 @@ export class Event extends HashObject {
/** /**
* 防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。 * 防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。
* 冒泡和捕获都有用
* @method stopPropagation * @method stopPropagation
* @public * @public
* @since 2.0.0 * @since 2.0.0
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
import BlurXFilter from './BlurXFilter'; import BlurXFilter from './BlurXFilter';
import BlurYFilter from './BlurYFilter'; import BlurYFilter from './BlurYFilter';
import Filter from '../Filter'; import Filter from '../Filter';
import { BLEND_MODES } from '../../const';
/** /**
* The BlurFilter applies a Gaussian blur to an object. * The BlurFilter applies a Gaussian blur to an object.
...@@ -114,11 +115,11 @@ export default class BlurFilter extends Filter { ...@@ -114,11 +115,11 @@ export default class BlurFilter extends Filter {
* @member {number} * @member {number}
* @default BLEND_MODES.NORMAL * @default BLEND_MODES.NORMAL
*/ */
get blendMode() { get blendMode(): BLEND_MODES {
return this.blurYFilter.blendMode; return this.blurYFilter.blendMode;
} }
set blendMode(value) { set blendMode(value: BLEND_MODES) {
this.blurYFilter.blendMode = value; this.blurYFilter.blendMode = value;
} }
} }
import { TextField } from "./TextField"; import { TextField } from "./TextField";
import { MouseEvent } from "../events"; import { Event, MouseEvent } from "../events";
import { osType } from "../const"; import { osType } from "../const";
...@@ -9,7 +9,7 @@ import { osType } from "../const"; ...@@ -9,7 +9,7 @@ import { osType } from "../const";
export class EditableText extends TextField { export class EditableText extends TextField {
htmlElement: any; htmlElement: any;
private _prompt: string = ""; private _prompt: string = "请输入";
/** /**
* 未输入文本时显示的文字 * 未输入文本时显示的文字
*/ */
...@@ -157,10 +157,18 @@ export class EditableText extends TextField { ...@@ -157,10 +157,18 @@ export class EditableText extends TextField {
document.body.appendChild(htmlElement) document.body.appendChild(htmlElement)
} }
//添加 //添加
htmlElement.onblur = function () { htmlElement.onblur = function (e) {
if (osType == "ios") { if (osType == "ios") {
//部分app里的webview有兼容问题用window.scrollTo(0, 0)
window.scrollTo({ top: 0, left: 0, behavior: "smooth" }); window.scrollTo({ top: 0, left: 0, behavior: "smooth" });
} }
//抛出事件
if (s.hasEventListener(Event.BLUR)) s.dispatchEvent(Event.BLUR, e)
}; };
//输入事件
htmlElement.oninput = function (e) {
//抛出原生的input的事件
if (s.hasEventListener(Event.INPUT)) s.dispatchEvent(Event.INPUT, e)
}
} }
} }
...@@ -55,11 +55,11 @@ export interface KeyAniData { ...@@ -55,11 +55,11 @@ export interface KeyAniData {
to: number[], to: number[],
ti: number[], ti: number[],
h: number//暂时用是否存在判断。有标识瞬切,不缓动,待测试 h: number,//暂时用是否存在判断。有标识瞬切,不缓动,待测试
//后面记录的东西 //后面记录的东西
bezierData?//to存在时的贝塞尔数据 bezierData?,//to存在时的贝塞尔数据
fnc?//贝塞尔函数,可能是数组, fnc?,//贝塞尔函数,可能是数组,
} }
...@@ -95,6 +95,17 @@ class LottieBaseTrack extends HashObject implements IAnimationTrack { ...@@ -95,6 +95,17 @@ class LottieBaseTrack extends HashObject implements IAnimationTrack {
time = Math.min(time, this.times[this.times.length - 1].t); time = Math.min(time, this.times[this.times.length - 1].t);
// //
} }
/**
* 因为有些表达式
* @param time
*/
protected cacTrueTime(time: number) {
if (this.loop && this.loop.loopInOrOut) {
time = (this.loop.loopInOrOut == 1 ? loopIn : loopOut)(this.loop.type, this.loop.duration, this.times, time)
}
return time;
}
protected cacValue(time: number) { protected cacValue(time: number) {
if (time <= this.times[0].t) return this.times[0].s; if (time <= this.times[0].t) return this.times[0].s;
if (time >= this.times[this.times.length - 1].t) return this.times[this.times.length - 1].s; if (time >= this.times[this.times.length - 1].t) return this.times[this.times.length - 1].s;
......
...@@ -3,7 +3,7 @@ import Texture from "../texture/Texture"; ...@@ -3,7 +3,7 @@ import Texture from "../texture/Texture";
import Sprite from "../display/Sprite"; import Sprite from "../display/Sprite";
import { Event } from "../events/Event"; import { Event } from "../events/Event";
import { TextureCache, createImage, createCanvas } from "../utils"; import { TextureCache, createImage, createCanvas, rgb2hex } from "../utils";
import { RAD_TO_DEG } from "../const"; import { RAD_TO_DEG } from "../const";
import { Matrix } from "../math"; import { Matrix } from "../math";
import { BaseTexture } from "../texture"; import { BaseTexture } from "../texture";
...@@ -622,7 +622,7 @@ export class MovieClip extends Container { ...@@ -622,7 +622,7 @@ export class MovieClip extends Container {
//@ts-ignore ,需要记载child里 //@ts-ignore ,需要记载child里
if (!child.mask) child.mask = child.addChild(child["cusMask"]); if (!child.mask) child.mask = child.addChild(child["cusMask"]);
let mask = child.mask; let mask = child.mask;
this.updateMask(mask, frame.maskPath); MovieClip.drawBezierShape(mask, frame.maskPath);
} else if (child.mask) { } else if (child.mask) {
//@ts-ignore移除 //@ts-ignore移除
child.removeChild(child.mask) child.removeChild(child.mask)
...@@ -714,16 +714,93 @@ export class MovieClip extends Container { ...@@ -714,16 +714,93 @@ export class MovieClip extends Container {
this.rawData = null; this.rawData = null;
super.destroy(); super.destroy();
} }
/**
private updateMask(mask: Shape, data: { _d: string, _style: any, _transform: any }) { * 用源数据拷贝一份,用相应参数
* @param frames 源数据
* @param x 偏移x,默认0
* @param y 偏移y,默认0
* @param scaleX 相对缩放x,默认1
* @param scaleY 相对缩放y,默认1
* @param rotation 相对旋转,角度制,默认0
* @param anchorX 相对锚点x,默认0
* @param anchorY 相对锚点y,默认0
*/
static deepCopyFrames(
frames,
x: number = 0,
y: number = 0,
scaleX: number = 1,
scaleY: number = 1,
rotation: number = 0,
anchorX: number = 0,
anchorY: number = 0
) {
var cf = [];
rotation *= Math.PI / 180;
//@ts-ignore
var lt: Matrix = {};
lt.a = Math.cos(rotation) * scaleX;
lt.b = Math.sin(rotation) * scaleX;
lt.c = -Math.sin(rotation) * scaleY;
lt.d = Math.cos(rotation) * scaleY;
lt.tx = x + anchorX - ((anchorX * lt.a) + (anchorY * lt.c));
lt.ty = y + anchorY - ((anchorX * lt.b) + (anchorY * lt.d));
for (var j = 0; j < frames.length; j++) {
var frame = frames[j];
const pt = frame.transform;
var f = { alpha: 0, transform: null };
//透明度
f.alpha = frame.alpha;
f.transform = {
a: (lt.a * pt.a) + (lt.b * pt.c),
b: (lt.a * pt.b) + (lt.b * pt.d),
c: (lt.c * pt.a) + (lt.d * pt.c),
d: (lt.c * pt.b) + (lt.d * pt.d),
tx: (lt.tx * pt.a) + (lt.ty * pt.c) + pt.tx,
ty: (lt.tx * pt.b) + (lt.ty * pt.d) + pt.ty,
};
cf.push(f)
}
return cf;
}
/**
* 根据数据获取遮罩,或更新遮罩,暂时用于遮罩,以后可能用于矢量图
* @param mask
* @param data
* @param useStyle 是否应用样式,一般用于遮罩时不需要,默认false
* @returns
*/
static drawBezierShape(mask: Shape = new Shape, data: { _d: string, _styles: any, _transform: any }, useStyle: boolean = false) {
mask.clear(); mask.clear();
const styles = data._styles;
if (useStyle && styles) {//待测试,两个都有的时候是否能正常绘制,毕竟都执行了beginPath
if (styles.stroke) {
mask.beginStroke(
rgb2hex(styles.stroke),
styles.strokeWidth || undefined,
styles.lineCap || undefined,
styles.lineJoin || undefined,
styles.miterLimit || undefined,
styles.stroke[3]
)
}
if (styles.fill) {
mask.beginFill(rgb2hex(styles.fill), styles.fill[3])
}
// if (styles && styles.lineDash) {
// ctx.setLineDash(styles.lineDash);
// }
} else {
//简单绘制
mask.beginFill();
}
//会用到的,再说TODO //会用到的,再说TODO
if (data._transform) { if (data._transform) {
//用于修改所有路径的矩阵数据
mask.transform.localMatrix.copy(data._transform)
mask.transform._parentID = -1;
} }
let currentPoint = { x: 0, y: 0, x1: 0, y1: 0, x2: 0, y2: 0 } let currentPoint = { x: 0, y: 0, x1: 0, y1: 0, x2: 0, y2: 0 };
//暂时不需要绘制的东西
mask.beginFill();
const validMethods = 'MLHVCSQRZmlhvcsqrz' const validMethods = 'MLHVCSQRZmlhvcsqrz'
const d = data._d.replace(/([a-zA-Z])/g, '|||$1 ').replace(/,/g, ' '); const d = data._d.replace(/([a-zA-Z])/g, '|||$1 ').replace(/,/g, ' ');
d.split('|||').forEach(segment => { d.split('|||').forEach(segment => {
...@@ -847,56 +924,15 @@ export class MovieClip extends Container { ...@@ -847,56 +924,15 @@ export class MovieClip extends Container {
} }
} }
}) })
//暂时没有其他绘制,直接endFill
mask.endFill(); if (useStyle && styles) {//待测试,两者是否都能执行
} if (styles.fill) mask.endFill();
/** if (styles.stroke) mask.endStroke();
* 用源数据拷贝一份,用相应参数 } else {
* @param frames 源数据 //简单,直接绘制
* @param x 偏移x,默认0 mask.endFill();
* @param y 偏移y,默认0
* @param scaleX 相对缩放x,默认1
* @param scaleY 相对缩放y,默认1
* @param rotation 相对旋转,角度制,默认0
* @param anchorX 相对锚点x,默认0
* @param anchorY 相对锚点y,默认0
*/
static deepCopyFrames(
frames,
x: number = 0,
y: number = 0,
scaleX: number = 1,
scaleY: number = 1,
rotation: number = 0,
anchorX: number = 0,
anchorY: number = 0
) {
var cf = [];
rotation *= Math.PI / 180;
//@ts-ignore
var lt: Matrix = {};
lt.a = Math.cos(rotation) * scaleX;
lt.b = Math.sin(rotation) * scaleX;
lt.c = -Math.sin(rotation) * scaleY;
lt.d = Math.cos(rotation) * scaleY;
lt.tx = x + anchorX - ((anchorX * lt.a) + (anchorY * lt.c));
lt.ty = y + anchorY - ((anchorX * lt.b) + (anchorY * lt.d));
for (var j = 0; j < frames.length; j++) {
var frame = frames[j];
const pt = frame.transform;
var f = { alpha: 0, transform: null };
//透明度
f.alpha = frame.alpha;
f.transform = {
a: (lt.a * pt.a) + (lt.b * pt.c),
b: (lt.a * pt.b) + (lt.b * pt.d),
c: (lt.c * pt.a) + (lt.d * pt.c),
d: (lt.c * pt.b) + (lt.d * pt.d),
tx: (lt.tx * pt.a) + (lt.ty * pt.c) + pt.tx,
ty: (lt.tx * pt.b) + (lt.ty * pt.d) + pt.ty,
};
cf.push(f)
} }
return cf; //返回
return mask;
} }
} }
\ No newline at end of file
...@@ -145,7 +145,7 @@ export class ScrollPage extends Container { ...@@ -145,7 +145,7 @@ export class ScrollPage extends Container {
public isSpringBack: boolean = true; public isSpringBack: boolean = true;
/** /**
* 构造函数 * 注意滚动内容在view里加
* @method ScrollPage * @method ScrollPage
* @param {number} vW 可视区域宽 * @param {number} vW 可视区域宽
* @param {number} vH 可视区域高 * @param {number} vH 可视区域高
......
// export { default as GroupD8 } from './GroupD8'; //基本用了pixi的glCore,灵活性还有点问题,以后有机会改
export { GLTexture } from './GLTexture'; export { GLTexture } from './GLTexture';
export { GLBuffer } from './GLBuffer'; export { GLBuffer } from './GLBuffer';
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment