Commit 14ed7b3c authored by wangjianfeng.yz's avatar wangjianfeng.yz

2.0.65

parent 207a7bf0
......@@ -19,4 +19,5 @@ examples
docs
adapters
testThree
README.md
\ No newline at end of file
README.md
abandoned
\ No newline at end of file
import { ScrollPage } from "./ScrollPage";
import { DisplayObject } from "../display/DisplayObject";
import { Event } from "../events/Event";
/**
* 滚动类的Item类接口
* @class IScrollListItem
* @public
* @extends DisplayObject
* @since 1.0.9
*/
export interface IScrollListItem extends DisplayObject {
initData(id: number, data: any): void;
id: number;
data: number;
}
/**
* 滚动列表
* @class ScrollList
* @public
* @extends ScrollPage
* @since 1.0.9
*/
export class ScrollList extends ScrollPage {
private _items: Array<IScrollListItem> = null;
private _itemW: number;
private _itemH: number;
private _itemRow: number;
private _itemCol: number;
private _itemCount: number;
private _itemClass: any;
private _isInit: number = 0;
public data: Array<any> = [];
private downL: DisplayObject = null;
private _cols: number;
private _disParam: string;
private _lastFirstId: number = -1;
/**
* 获取下拉滚动的loadingView对象
* @property loadingView
* @since 1.0.9
* @return {DisplayObject}
*/
public get loadingView(): DisplayObject {
return this.downL;
}
/**
* 构造函数
* @method ScrollList
* @param {Class} itemClassName 可以做为Item的类
* @param {number} itemWidth item宽
* @param {number} itemHeight item高
* @param {number} vW 列表的宽
* @param {number} vH 列表的高
* @param {boolean} isVertical 是横向滚动还是纵向滚动 默认是纵向
* @param {number} cols 分几列,默认是1列
* @since 1.0.9
*/
constructor(itemClassName: any, itemWidth: number, itemHeight: number, vW: number, vH: number, isVertical: boolean = true, cols: number = 1) {
super(vW, vH, 0, isVertical);
let s = this;
s._instanceType = "ScrollList";
s._itemW = itemWidth;
s._itemH = itemHeight;
s._items = [];
s._itemClass = itemClassName;
s._itemCount = 0;
s._cols = cols;
s._updateViewRect();
s.addEventListener(Event.ENTER_FRAME, s.flushData.bind(s));
}
/**
* 更新列表数据
* @method updateData
* @param {Array} data
* @param {boolean} isReset 是否重围数据列表。默认为true
* @since 1.0.9
*/
public updateData(data: Array<any>, isReset: boolean = true): void {
let s: any = this;
if (!s._isInit || isReset) {
s.data = data;
} else {
s.data = s.data.concat(data);
}
s._isInit = 1;
s._lastFirstId = -1;
s._updateId = -1;//确保会刷新
s.maxDistance = Math.ceil(s.data.length / s._cols) * s._itemRow;
if (s.downL) {
s.downL[s.paramXY] = Math.max(s.distance, s.maxDistance);
var wh = s.downL.getWH();
s.maxDistance += (s.paramXY == "x" ? wh.width : wh.height);
}
}
private _updateId: number = -1;
private flushData() {
let s: ScrollList = this;
if (s._isInit > 0) {
if (s._updateId != s.view.transform._localID) {
s._updateId = s.view.transform._localID
let id: number = s.view[s.paramXY] > 0 ? 0 : (Math.abs(Math.floor(s.view[s.paramXY] / s._itemRow)) - 1) * s._cols;
id = id < 0 ? 0 : id;
if (id != s._lastFirstId) {
s._lastFirstId = id;
if (id != s._items[0].id) {
for (let r = 0; r < s._cols; r++) {
if (s.speed > 0) {
s._items.unshift(s._items.pop());
} else {
s._items.push(s._items.shift());
}
}
}
}
for (let i = 0; i < s._itemCount; i++) {
let item: any = s._items[i];
if (s._isInit == 1) {
item.sli_id = -1;
}
if (item.sli_id != id) {
item.initData(s.data[id] ? id : -1, s.data[id]);
item[s.paramXY] = Math.floor(id / s._cols) * s._itemRow;
item[s._disParam] = (id % s._cols) * s._itemCol;
//如果没有数据则隐藏
if (s.data[id]) {
item.sli_id = id;
item.visible = true;
} else {
item.sli_id = -1;
item.visible = false;
}
}
id++;
}
s._isInit = 2;
}
}
}
/**
* 设置可见区域,可见区域的坐标始终在本地坐标中0,0点位置
* @method setViewRect
* @param {number}w 设置可见区域的宽
* @param {number}h 设置可见区域的高
* @param {boolean} isVertical 方向
* @public
* @since 1.1.1
*/
public setViewRect(w: number, h: number, isVertical: boolean): void {
super.setViewRect(w, h, isVertical);
let s = this;
if (s._itemRow && s._itemCol) {
s._updateViewRect();
}
}
private _updateViewRect() {
let s: any = this;
if (s.isVertical) {
s._disParam = "x";
s._itemRow = s._itemH;
s._itemCol = s._itemW;
} else {
s._disParam = "y";
s._itemRow = s._itemW;
s._itemCol = s._itemH;
}
let newCount: number = (Math.ceil(s.distance / s._itemRow) + 1) * s._cols;
if (newCount != s._itemCount) {
if (newCount > s._itemCount) {
for (let i = s._itemCount; i < newCount; i++) {
let item = new s._itemClass();
item.id = -1;
item.data = null;
s._items.push(item);
s.view.addChild(item);
}
} else {
for (let i = 0; i < s._itemCount - newCount; i++) {
s.view.removeChild(s._items.pop());
}
}
s._itemCount = newCount;
s._lastFirstId = -1;
}
}
/**
* 设置加载数据时显示的loading对象
* @since 1.0.9
* @method setLoading
* @param {DisplayObject} downLoading
*/
public setLoading(downLoading: DisplayObject): void {
let s: any = this;
if (s.downL) {
s.view.removeChild(s.downL);
let wh = s.downL.getWH();
s.maxDistance -= (s.paramXY == "x" ? wh.width : wh.height);
s.downL = null;
}
if (downLoading) {
s.downL = downLoading;
s.view.addChild(downLoading);
s.downL[s.paramXY] = Math.max(s.distance, s.maxDistance);
let wh = s.downL.getWH();
s.maxDistance += (s.paramXY == "x" ? wh.width : wh.height);
} else {
s.isStop = false;
}
}
public destroy(): void {
let s = this;
s._items = null;
s._itemClass = null;
s.data = null;
s.downL = null;
super.destroy();
}
}
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.
This diff is collapsed.
......@@ -144,7 +144,6 @@
}, "./res/chapterNum" + c + ".png")
}
})
console.log(textures)
var bitmapText = stage.addChild(new FYGE.BitmapText(textures))
bitmapText.text = "12345"
bitmapText.x = 300
......@@ -153,43 +152,49 @@
bitmapText.verticalAlign = "middle"
bitmapText.gap = -6
var b = { x: 0 }
console.log(bitmapText)
// FYGE.Tween.get(b, {
// onChange: () => {//缓动改变时监听
// bitmapText.text = "" + Math.round(b.x)
// }
// })
// .to({ x: 10000 }, 100000)
FYGE.Tween.get(b, {
onChange: () => {//缓动改变时监听
bitmapText.text = "" + Math.round(b.x)
}
})
.to({ x: 10000 }, 100000)
//按钮
var btn = stage.addChild(new FYGE.Button(texture))
.addEventListener(FYGE.MouseEvent.CLICK, () => { console.log("点击了按钮") }, this)
.position.set(0, 1100)
//滚动视图
var scroll = stage.addChild(new FYGE.ScrollPage(640, 656, 100, true, false))
var scroll = stage.addChild(new FYGE.ScrollView(640, 656, 0,1000 , false))
scroll.position.set(500, 1100)
scroll.view.addChild(new FYGE.Sprite(texture))//在view里面添加
scroll.maxDistance = 1000
setTimeout(() => { scroll.scrollTo(200, 2000) }, 2000)
setTimeout(() => { scroll.scrollTo(0, 200,2000) }, 2000)
//滚动列表
var list = new FYGE.ScrollList(class extends FYGE.Sprite {
var list = new FYGE.ScrollList(class extends FYGE.ScrollListItem {
constructor() {
super()
this.txt = new FYGE.TextField();
this.txt.size = 50;
this.txt.text ="00"
this.txt.fillColor = "#ff0000";
this.addChild(this.txt)
// console.log(this)
}
initData(id, data) {
if (id < 0 || !data) return
onDataChanged( data) {
// console.log(111)
// if (id < 0 || !data) return
this.txt.text = data + ""
}
}
, 100, 60, 100, 400, true)
, 100, 60, 100, 300, true)
list.x = 100;
list.y = 300;
list.updateData([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], true)//更新数据,true覆盖原先数据
list.setData([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], true)//更新数据,true覆盖原先数据
stage.addChild(list);
setTimeout(()=>{
// list.setData([1, 2, 3, 4], true)
list.setViewRect(100,500,true)
// list.setData(null,true)
},5000)
//帧动画
var texArr = []//需要纹理的数组
......
{
"name": "fyge",
"version": "2.0.63",
"version": "2.0.65",
"description": "canvas渲染引擎",
"main": "./build/fyge.min.js",
"module": "./build/fyge.esm.js",
......
......@@ -582,6 +582,15 @@
createTextureSheet文件里新增导出类型ITextureSheetFrameData,新增方法loadSheet
新增接口Dict,并且很多按照这种方式修改,并且很多interface都导出了
2.0.65 Container去掉方法onChildrenChange,也确实没地方用到
Container区分方法getChildByName和getChildrenByName
Container的removeChild方法添加泛型,removeAllChildren和spliceChildren去掉泛型
Container添加静态属性_childrenOperationMethods
DisplayObject的destroy方法里removeAllEventListener的操作放到removeChild之后,否则移除舞台的事件触发不了
Event里添加静态属性SCROLLING
新增一个ScrollView类并导出,ScrollList也继承自它大改,待大量测试
Object3D的lookAt方法新增一个重载,可传xyz对象
Object3D的update方法去掉自身的visible判断
......@@ -589,6 +598,9 @@
destroyed啥时候要处理下
setting对象是有效的,到时全局的设置就用这个
对于lottie和svga是纯json情况下,到时用weakMap存各自的纹理
......
......@@ -7,7 +7,7 @@
* @name VERSION
* @type {string}
*/
export const VERSION = "2.0.63";
export const VERSION = "2.0.65";
/**
......
......@@ -35,13 +35,13 @@ export default class Container extends DisplayObject {
this.children = [];
}
/**
* children改变时触发,暂时没地方用到,考虑废弃
* @param {number} index
*/
onChildrenChange(index: number) {
//子类需要时重写
}
// /**
// * children改变时触发,暂时没地方用到,考虑废弃
// * @param {number} index
// */
// onChildrenChange(index: number) {
// //子类需要时重写
// }
/**
* 添加child,在所有子级的最上层
......@@ -110,7 +110,7 @@ export default class Container extends DisplayObject {
child._onDispatchBubbledEvent(Event.ADDED_TO_STAGE);
}
this.onChildrenChange(index);
// this.onChildrenChange(index);
return child;
}
......@@ -145,7 +145,7 @@ export default class Container extends DisplayObject {
s.children[id1] = s.children[id2];
s.children[id2] = temp;
this.onChildrenChange(id1 < id2 ? id1 : id2);
// this.onChildrenChange(id1 < id2 ? id1 : id2);
return true;
}
......@@ -185,14 +185,12 @@ export default class Container extends DisplayObject {
}
return this.children[index];
}
/**
* 通过名字获取子级
* @param name
* @param isOnlyOne
* @param isRecursive
* 通过名字获取一个子级,找到一个符合的就返回
* @param name 名字或正则
* @param isRecursive 是否递归往子级查找,默认false
*/
public getChildByName(name: string | RegExp, isOnlyOne: boolean = true, isRecursive: boolean = false): any {
public getChildByName(name: string | RegExp, isRecursive: boolean = false): DisplayObject {
if (!name) return null;
let s = this;
let rex: any;
......@@ -202,15 +200,26 @@ export default class Container extends DisplayObject {
rex = name;
}
let elements: Array<DisplayObject> = [];
Container._getElementsByName(rex, s, isOnlyOne, isRecursive, elements);
let len = elements.length;
if (len == 0) {
return null;
} else if (len == 1) {
return elements[0];
Container._getElementsByName(rex, s, true, isRecursive, elements);
return elements[0] || null;
}
/**
* 通过名字获取子级数组
* @param name 名字或正则
* @param isRecursive 是否递归往子级查找,默认false
*/
public getChildrenByName(name: string | RegExp, isRecursive: boolean = false): DisplayObject[] {
if (!name) return null;
let s = this;
let rex: any;
if (typeof (name) == "string") {
rex = new RegExp("^" + name + "$");
} else {
return elements;
rex = name;
}
let elements: Array<DisplayObject> = [];
Container._getElementsByName(rex, s, false, isRecursive, elements);
return elements;
}
/**
......@@ -218,7 +227,7 @@ export default class Container extends DisplayObject {
* @param {DisplayObject} child
* @return {DisplayObject}
*/
removeChild(child: DisplayObject): DisplayObject {
removeChild<T extends DisplayObject>(child: T): T {
const index = this.children.indexOf(child);
......@@ -255,7 +264,7 @@ export default class Container extends DisplayObject {
//保证包围盒重新计算
this._boundsID++;
this.onChildrenChange(index);
// this.onChildrenChange(index);
return child;
}
......@@ -265,7 +274,7 @@ export default class Container extends DisplayObject {
*/
removeChildren<T extends DisplayObject>(...children: T[]): T[] {
//待测试,arr.splice(0)会全部删除,arr.splice(0,undefined)不会,所以this.spliceChildren(0)下面执行的是splice(0,undefined)
if (!children.length) return this.spliceChildren(0, this.children.length);
if (!children.length) return this.spliceChildren(0, this.children.length) as T[];
children.forEach((child: T) => { this.removeChild(child); })
return children
......@@ -274,7 +283,7 @@ export default class Container extends DisplayObject {
* 移除所有子级
* @returns 返回移除的子级的数组
*/
removeAllChildren<T extends DisplayObject>(): T[] {
removeAllChildren(): DisplayObject[] {
return this.removeChildren()
}
/**
......@@ -302,7 +311,7 @@ export default class Container extends DisplayObject {
* @param beginIndex 开始索引
* @param count 移除数量
*/
spliceChildren<T extends DisplayObject>(beginIndex?: number, count?: number): T[] {
spliceChildren(beginIndex?: number, count?: number): DisplayObject[] {
let removed = this.children.splice(beginIndex, count);
if (!removed.length) return [];
......@@ -316,12 +325,12 @@ export default class Container extends DisplayObject {
this._boundsID++;
this.onChildrenChange(beginIndex);
// this.onChildrenChange(beginIndex);
for (let i = 0; i < removed.length; ++i) {
removed[i]._onDispatchBubbledEvent(Event.REMOVED_FROM_STAGE);
}
return removed as T[];
return removed;
}
/**
......@@ -674,6 +683,21 @@ export default class Container extends DisplayObject {
}
}
}
/**
* 操作子级的所有方法,需要维护
*/
public static _childrenOperationMethods: string[] = [
//添加子级的方法
"addChild", "addChildAt", "addChildren",
//移除子级的方法
"removeChild", "removeChildAt", "removeChildren", "removeAllChildren", "removeChildrenAt", "spliceChildren",
//获取子级的方法
"getChildAt", "getChildByName", "getChildrenByName",
//获取子级索引的方法
"getChildIndex",
//改变子级索引的方法
"setChildIndex", "swapChildren"
]
}
Container.prototype.containerUpdateTransform = Container.prototype.updateTransform;
......
......@@ -393,13 +393,13 @@ export class DisplayObject extends EventDispatcher {
* 基本销毁方法
*/
destroy() {
//移除所有监听
//如果有父级,从中移除自己
this.removeAllEventListener();
// super.destroy();//不适用继承的,里面的eventTypes置空很麻烦
//如果有父级,从中移除自己
if (this.parent) {
this.parent.removeChild(this);
}
//移除所有监听,放在父级移除自己后面,因为有舞台移除事件
this.removeAllEventListener();
//矩阵销毁
this.transform.destroy();
//对应属性都置null
......
......@@ -569,7 +569,7 @@ export default class Sprite extends Container {
// else {
// value.once('update', this._onTextureUpdate, this);//只会监听一次
// }
//都监听下,其实没加载的纹理图片纹理确实只需要监听一次,这里先不管了,后续有性能问题再考虑
//都监听下,其实没加载的纹理图片纹理确实只需要监听一次,这里先不管了,存在性能问题,当一个纹理被大量对象使用时,事件数组会很大,导致遍历性能,TODO
value.addEventListener('update', this._onTextureUpdate, this);
} else {
//624修改。如果置空纹理,_localBoundsSelf置空
......
......@@ -19,7 +19,7 @@ export class Event extends HashObject {
public static RESIZE: string = "onResize";
/**
* ScrollPage组件滑动到开始位置事件
* Scroll组件滑动到开始位置事件
* @property SCROLL_TO_HEAD
* @static
* @since 1.1.0
......@@ -27,7 +27,7 @@ export class Event extends HashObject {
*/
public static SCROLL_TO_HEAD: string = "onScrollToHead";
/**
* ScrollPage组件停止滑动事件
* Scroll组件停止滑动事件
* @property SCROLL_STOP
* @static
* @since 1.1.0
......@@ -35,7 +35,7 @@ export class Event extends HashObject {
*/
public static SCROLL_STOP: string = "onScrollStop";
/**
* ScrollPage组件开始滑动事件
* Scroll组件开始滑动事件
* @property SCROLL_START
* @static
* @since 1.1.0
......@@ -43,13 +43,17 @@ export class Event extends HashObject {
*/
public static SCROLL_START: string = "onScrollStart";
/**
* ScrollPage组件滑动到结束位置事件
* Scroll组件滑动到结束位置事件
* @property SCROLL_TO_END
* @static
* @since 1.1.0
* @type {string}
*/
public static SCROLL_TO_END: string = "onScrollToEnd";
/**
* Scroll组件滚动时触发
*/
public static SCROLLING: string = "onScrolling";
/**
* 舞台初始化完成后会触发的事件
* @property INIT_STAGE
......
This diff is collapsed.
......@@ -161,6 +161,7 @@ export class ScrollPage extends Container {
*/
constructor(vW: number, vH: number, maxDistance: number, isVertical: boolean = true, isFull = false) {
super();
console.warn("class ScrollPage will be abandoned soon, use class ScrollView instead");
let s: ScrollPage = this;
s._instanceType = "ScrollPage";
s.addChild(s.maskObj);
......
This diff is collapsed.
......@@ -9,4 +9,6 @@ export * from "./MovieClip";//暂时只有一个项目用过换装,三只松
export * from "./SvgaAni";
export * from "./Lottie";
\ No newline at end of file
export * from "./Lottie";
export * from "./ScrollView";
\ No newline at end of file
......@@ -189,13 +189,29 @@ export class Object3D extends EventDispatcher {
return this;
}
lookAt(x: number, y: number, z: number) {
/**
* 设置物体朝向
* @param vec3 一个存在x,y,z的矢量,比如mesh.position
*/
lookAt(vec3: { x: number, y: number, z: number }): void;
/**
* 设置物体朝向
* @param x 朝向位置x
* @param y 朝向位置y
* @param z 朝向位置z
*/
lookAt(x: number, y: number, z: number): void;
lookAt(x: any, y?: number, z?: number) {
var q1 = new Quaternion();
var m1 = new Matrix4();
var target = new Vector3();
var position = new Vector3();
target.set(x, y, z);
if (typeof x == "object") {
target.copy(x);
} else {
target.set(x, y, z);
}
var parent = this.parent;
......@@ -303,7 +319,7 @@ export class Object3D extends EventDispatcher {
* 统一更新方法,子类可重写,基类用于派发监听事件
*/
update() {
if (!this.visible) return;
// if (!this.visible) return;//从root往下时block(比如下面子级的visible判断),自身不进行判断
//监听的
if (this.hasEventListener(Event.ENTER_FRAME)) {
this.dispatchEvent(Event.ENTER_FRAME);
......
<!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" />
<!-- 主引擎 -->
<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>
</body>
<script>
window.addEventListener("load", async function () {
//获取canvas
var canvas = document.getElementById("canvas");
//建舞台,定宽适配,会根据实际窗口尺寸上下裁切,所以stage实际y坐标会偏移stage.viewRect.y
var stage = new FYGE.Stage(
canvas,
750,//设计宽度,按设计搞给的就行
1624,//设计高度
document.body.clientWidth,
document.body.clientHeight,
FYGE.RENDERER_TYPE.WEBGL,
false,
false,
window.devicePixelRatio || 1//分辨率
);
window.stage = stage;
//监听窗口缩放,按需,一般移动端的不需要
window.addEventListener('resize', () => { stage.resize() });
//鼠标事件
stage.addWebMouseEvent();
//stage初始化
stage.addEventListener(FYGE.Event.INIT_STAGE, async () => {
//单图纹理
var texture = await new Promise((r) => {
FYGE.GlobalLoader.loadImage((s, image) => {
r(FYGE.Texture.fromImage(image))
}, "./res/aa.png")
})
//添加个背景矢量图
var g = new FYGE.Graphics()
.beginFill(0x000000, 0.7)
.drawRect(0, 0, 750, 1624)
.endFill()
//滚动视图
var scroll = stage.addChild(new FYGE.ScrollView(
600, 1000, 0, 20000))
scroll.position.set(100, 100)
let sp = new FYGE.Sprite(texture)
sp.height = 20000
// sp.x=-100000
scroll.view.addChild(sp)//在view里面添加
// setTimeout(() => { scroll.scrollHeight=200 }, 2000)
//滚动列表
var list = new FYGE.ScrollList(class extends FYGE.Sprite {
constructor() {
super()
this.txt = new FYGE.TextField();
this.txt.size = 50;
this.txt.text = "00"
this.txt.fillColor = "#ff0000";
this.addChild(this.txt)
// console.log(this)
}
onDataChanged(data) {
// console.log(111)
// if (id < 0 || !data) return
this.txt.text = data + ""
}
}
, 100, 60, 100, 300, true)
list.x = 0;
list.y = 300;
list.setData([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], true)//更新数据,true覆盖原先数据
stage.addChild(list);
console.log(list)
setTimeout(() => {
// list.setData([1, 2, 3, 4], true)
// list.setViewRect(100, 500, true)
// list.setViewRect(500, 100, false)
// list.setData(null,true)
list.destroy()
}, 5000)
}, this);
//循环
loop();
function loop() {
//Tween每帧刷新
FYGE.Tween.flush()
//舞台每帧刷新
stage.flush();
// FYGE.getRequestAnimationFrame()(loop);
requestAnimationFrame(loop)
}
})
</script>
</html>
\ No newline at end of file
......@@ -22,6 +22,7 @@
"exclude": [
"node_modules",
"types",
"build"//build也忽略,可以避免开发的时候,引用到build里的声明文件,不过这样build里的声明文件的代码检查就无效了
"abandoned",
"build" //build也忽略,可以避免开发的时候,引用到build里的声明文件,不过这样build里的声明文件的代码检查就无效了
]
}
\ No newline at end of file
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