Commit abc1ac69 authored by wangjianfeng.yz's avatar wangjianfeng.yz

2.0.56

parent fc4461c8
declare namespace FYGE{export const VERSION = "2.0.55"; declare namespace FYGE{export const VERSION = "2.0.56";
export function cos(angle: number): number; export function cos(angle: number): number;
...@@ -5517,21 +5517,6 @@ export class Stage extends Container { ...@@ -5517,21 +5517,6 @@ export class Stage extends Container {
* @default null * @default null
*/ */
renderObj: SystemRenderer; renderObj: SystemRenderer;
/**
* 直接获取stage的引用,避免总是从Event.ADD_TO_STAGE 事件中去获取stage引用
* @property getStage
* @param {string} stageName
* @return {any}
* @since 2.0.0
*/
static getStage(stageName?: string): Stage;
/**
* @property _stageList
* @static
* @type {Object}
* @private
*/
private static _stageList;
/** /**
* 舞台在设备里截取后的可见区域,有些时候知道可见区域是非常重要的,因为这样你就可以根据舞台的可见区域做自适应了。 * 舞台在设备里截取后的可见区域,有些时候知道可见区域是非常重要的,因为这样你就可以根据舞台的可见区域做自适应了。
* @property viewRect * @property viewRect
...@@ -5617,6 +5602,15 @@ export class Stage extends Container { ...@@ -5617,6 +5602,15 @@ export class Stage extends Container {
private canvasOffsetTb; private canvasOffsetTb;
get stageWidth(): number; get stageWidth(): number;
get stageHeight(): number; get stageHeight(): number;
/**
* 是否自动转向,一般对于需要手机横屏自动更新内容朝向的设置为true,自动对齐设计尺寸和屏幕显示尺寸
* 默认false
* @property autoSteering
* @public
* @type {boolean}
* @default false
*/
autoSteering: boolean;
/** /**
* 缩放模式 * 缩放模式
*/ */
...@@ -6903,6 +6897,13 @@ export class TextField extends Sprite { ...@@ -6903,6 +6897,13 @@ export class TextField extends Sprite {
* @since 1.0.0 * @since 1.0.0
*/ */
private _getMeasuredWidth; private _getMeasuredWidth;
/**
* 根据宽度截取文本,
* 注意调用前需要_prepContext,保证文本属性,否则测量文本宽度有误
* @param str 需要截取的文本
* @param textWidth 截取宽度,不传默认使用本身设置的文本宽度,如未设置不处理
*/
private _cutLines;
private realLines; private realLines;
private callback; private callback;
/** /**
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
export const VERSION = "2.0.55"; export const VERSION = "2.0.56";
export function cos(angle: number): number; export function cos(angle: number): number;
...@@ -5517,21 +5517,6 @@ export class Stage extends Container { ...@@ -5517,21 +5517,6 @@ export class Stage extends Container {
* @default null * @default null
*/ */
renderObj: SystemRenderer; renderObj: SystemRenderer;
/**
* 直接获取stage的引用,避免总是从Event.ADD_TO_STAGE 事件中去获取stage引用
* @property getStage
* @param {string} stageName
* @return {any}
* @since 2.0.0
*/
static getStage(stageName?: string): Stage;
/**
* @property _stageList
* @static
* @type {Object}
* @private
*/
private static _stageList;
/** /**
* 舞台在设备里截取后的可见区域,有些时候知道可见区域是非常重要的,因为这样你就可以根据舞台的可见区域做自适应了。 * 舞台在设备里截取后的可见区域,有些时候知道可见区域是非常重要的,因为这样你就可以根据舞台的可见区域做自适应了。
* @property viewRect * @property viewRect
...@@ -5617,6 +5602,15 @@ export class Stage extends Container { ...@@ -5617,6 +5602,15 @@ export class Stage extends Container {
private canvasOffsetTb; private canvasOffsetTb;
get stageWidth(): number; get stageWidth(): number;
get stageHeight(): number; get stageHeight(): number;
/**
* 是否自动转向,一般对于需要手机横屏自动更新内容朝向的设置为true,自动对齐设计尺寸和屏幕显示尺寸
* 默认false
* @property autoSteering
* @public
* @type {boolean}
* @default false
*/
autoSteering: boolean;
/** /**
* 缩放模式 * 缩放模式
*/ */
...@@ -6903,6 +6897,13 @@ export class TextField extends Sprite { ...@@ -6903,6 +6897,13 @@ export class TextField extends Sprite {
* @since 1.0.0 * @since 1.0.0
*/ */
private _getMeasuredWidth; private _getMeasuredWidth;
/**
* 根据宽度截取文本,
* 注意调用前需要_prepContext,保证文本属性,否则测量文本宽度有误
* @param str 需要截取的文本
* @param textWidth 截取宽度,不传默认使用本身设置的文本宽度,如未设置不处理
*/
private _cutLines;
private realLines; private realLines;
private callback; private callback;
/** /**
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
false, false,
sysInfo && sysInfo.pixelRatio || window.devicePixelRatio || 1//分辨率 sysInfo && sysInfo.pixelRatio || window.devicePixelRatio || 1//分辨率
); );
window.stage = stage;
//监听窗口缩放,按需,一般移动端的不需要 //监听窗口缩放,按需,一般移动端的不需要
window.addEventListener('resize', () => { stage.resize() }); window.addEventListener('resize', () => { stage.resize() });
//鼠标事件 //鼠标事件
......
{ {
"name": "fyge", "name": "fyge",
"version": "2.0.55", "version": "2.0.56",
"description": "canvas渲染引擎", "description": "canvas渲染引擎",
"main": "./build/fyge.min.js", "main": "./build/fyge.min.js",
"module": "./build/fyge.esm.js", "module": "./build/fyge.esm.js",
......
...@@ -541,12 +541,21 @@ ...@@ -541,12 +541,21 @@
TextField的canvas、context、dirty都变私有 TextField的canvas、context、dirty都变私有
TextField去掉offsetX和offsetY,相关使用删除,待测试,暂时感觉没啥用,和Shape一样,原先为了CanvasSpriteRenderer里,现在这俩都用anchorTexture了 TextField去掉offsetX和offsetY,相关使用删除,待测试,暂时感觉没啥用,和Shape一样,原先为了CanvasSpriteRenderer里,现在这俩都用anchorTexture了
2.0.56 Container文件里新增judgeMaskEnable函数,用于renderWebGL和renderCanvas里判断遮罩数据是否可用
Stage删除getStage静态方法,以及相关_stageList静态属性及构造内的赋值
Stage新增属性autoSteering,用于自动旋转舞台内容,相应方法_setAlign改动较大
BatchRenderer的flush方法里首次赋值currentGroup.blend = blendMode,打开注释
TextField的_prepContext方法新增执行ctx.lineJoin = "round";为了描边样式
TextField新增私有方法_cutLines,用于测量连续字符串宽度,并截取,取代原先单字符测量方式
TextField的updateText方法内多行文本内,对于未设置文本宽度textWidth,不执行下面的测量,用else连接,realLines单独处理
ScrollPage的scrollTo方法内缓动前增加执行移除先前缓动
需要一个矢量单独的2d绘制着色器了(顶点,颜色,纹理,),还是直接用统一的,到底哪种性能好,
Graphics,解决几何纹理的问题(图集,重复,变换,canvas绘制等)
texture的rotate属性设置修改纹理旋转会有大问题。尤其是45度角(groupD8里系数偏大)等,自身包围盒会有问题,且webgl模式下顶点计算有问题导致显示不全和纹理拉伸 texture的rotate属性设置修改纹理旋转会有大问题。尤其是45度角(groupD8里系数偏大)等,自身包围盒会有问题,且webgl模式下顶点计算有问题导致显示不全和纹理拉伸
在未解决前注释rotate的set方法 在未解决前注释rotate的set方法
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* @name VERSION * @name VERSION
* @type {string} * @type {string}
*/ */
export const VERSION = "2.0.55"; export const VERSION = "2.0.56";
/** /**
......
...@@ -429,16 +429,17 @@ export default class Container extends DisplayObject { ...@@ -429,16 +429,17 @@ export default class Container extends DisplayObject {
} }
//如果有遮罩,但是遮罩无数据,直接return //如果有遮罩,但是遮罩无数据,直接return
if (this.mask) { if (this.mask) {
//Shape遮罩,或者Sprite遮罩 // //Shape遮罩,或者Sprite遮罩
// if (this.mask.texture && this.mask.texture.valid) return//不能这么判断,因为此时valid肯定false // if (this.mask.texture) {
if (this.mask.texture) { // this.mask.updateShape && this.mask.updateShape();//更新一下
this.mask.updateShape && this.mask.updateShape();//更新一下 // if (!this.mask.texture.valid) return;
if (!this.mask.texture.valid) return; // }
} // //Graphics遮罩,其实这个判断也包括了Sprite的纹理为空的情况
//Graphics遮罩,其实这个判断也包括了Sprite的纹理为空的情况 // else if (!this.mask.graphicsData || !this.mask.graphicsData.length) {
else if (!this.mask.graphicsData || !this.mask.graphicsData.length) { // return;
return; // }
}
if (!judgeMaskEnable(this.mask)) return;
} }
//是否有遮罩。到时如果有滤镜, //是否有遮罩。到时如果有滤镜,
if (this.mask || (this.filters && this.filters.length)) { if (this.mask || (this.filters && this.filters.length)) {
...@@ -524,6 +525,8 @@ export default class Container extends DisplayObject { ...@@ -524,6 +525,8 @@ export default class Container extends DisplayObject {
} }
if (this.mask) { if (this.mask) {
//遮罩不可用无数据,return
if (!judgeMaskEnable(this.mask)) return;
renderer.maskManager.pushMask(this.mask); renderer.maskManager.pushMask(this.mask);
} }
...@@ -674,3 +677,17 @@ export default class Container extends DisplayObject { ...@@ -674,3 +677,17 @@ export default class Container extends DisplayObject {
} }
Container.prototype.containerUpdateTransform = Container.prototype.updateTransform; Container.prototype.containerUpdateTransform = Container.prototype.updateTransform;
function judgeMaskEnable(mask): boolean {
if (!mask) return false;
//Shape遮罩,或者Sprite遮罩
if (mask.texture) {
mask.updateShape && mask.updateShape();//更新一下
if (!mask.texture.valid) return false;
}
//Graphics遮罩,其实这个判断也包括了Sprite的纹理为空的情况
else if (!mask.graphicsData || !mask.graphicsData.length) {
return false;
}
return true;
}
\ No newline at end of file
...@@ -27,26 +27,6 @@ export class Stage extends Container { ...@@ -27,26 +27,6 @@ export class Stage extends Container {
*/ */
public renderObj: SystemRenderer = null; public renderObj: SystemRenderer = null;
/**
* 直接获取stage的引用,避免总是从Event.ADD_TO_STAGE 事件中去获取stage引用
* @property getStage
* @param {string} stageName
* @return {any}
* @since 2.0.0
*/
public static getStage(stageName: string = "cusEngine"): Stage {
return Stage._stageList[stageName];
}
/**
* @property _stageList
* @static
* @type {Object}
* @private
*/
private static _stageList: any = {};
/** /**
* 舞台在设备里截取后的可见区域,有些时候知道可见区域是非常重要的,因为这样你就可以根据舞台的可见区域做自适应了。 * 舞台在设备里截取后的可见区域,有些时候知道可见区域是非常重要的,因为这样你就可以根据舞台的可见区域做自适应了。
* @property viewRect * @property viewRect
...@@ -151,6 +131,15 @@ export class Stage extends Container { ...@@ -151,6 +131,15 @@ export class Stage extends Container {
get stageHeight() { get stageHeight() {
return this.viewRect.height; return this.viewRect.height;
} }
/**
* 是否自动转向,一般对于需要手机横屏自动更新内容朝向的设置为true,自动对齐设计尺寸和屏幕显示尺寸
* 默认false
* @property autoSteering
* @public
* @type {boolean}
* @default false
*/
public autoSteering: boolean = false;
/** /**
* 缩放模式 * 缩放模式
*/ */
...@@ -189,7 +178,6 @@ export class Stage extends Container { ...@@ -189,7 +178,6 @@ export class Stage extends Container {
this.canvas = canvas; this.canvas = canvas;
let s: Stage = this; let s: Stage = this;
this._instanceType = "Stage"; this._instanceType = "Stage";
Stage._stageList["canvas"] = s;
s.stage = this; s.stage = this;
s.name = "stageInstance_" + s.instanceId; s.name = "stageInstance_" + s.instanceId;
s.desWidth = desWidth; s.desWidth = desWidth;
...@@ -291,23 +279,56 @@ export class Stage extends Container { ...@@ -291,23 +279,56 @@ export class Stage extends Container {
private _setAlign() { private _setAlign() {
let s = this; let s = this;
let canvas = s.canvas; let canvas = s.canvas;
//实际尺寸和设计内容尺寸
let divW = canvas.width,
divH = canvas.height,
desW = s.desWidth,
desH = s.desHeight;
//舞台设置居中处理锚点和位置偏移 //舞台设置居中处理锚点和位置偏移
if (s._stageCenter) { if (s._stageCenter) {
s.anchorX = s.desWidth >> 1; s.anchorX = desW >> 1;
s.anchorY = s.desHeight >> 1; s.anchorY = desH >> 1;
s.x = (canvas.width - s.desWidth) >> 1; s.x = (divW - desW) >> 1;
s.y = (canvas.height - s.desHeight) >> 1; s.y = (divH - desH) >> 1;
}
//设备是否为竖屏
let isDivH = divH >= divW;
//内容是否为竖屏内容
let isDesH = desH >= desW;
//处理下,显示尺寸宽高颠倒下
if (s.autoSteering && isDesH != isDivH) {
let d = divH;
divH = divW;
divW = d;
} }
//默认定宽 //默认定宽
var scale = s._scaleMode == "fixedHeight" ? canvas.height / s.desHeight : canvas.width / s.desWidth; var scale = s._scaleMode == "fixedHeight" ? divH / desH : divW / desW;
s.scaleX = scale; s.scaleX = scale;
s.scaleY = scale; s.scaleY = scale;
//未设置自动转向,或不需要转向
if (!s.autoSteering || isDesH == isDivH) {
s.rotation = 0;
//没设置过居中的位移置0
if (!s._stageCenter) s.x = s.y = 0
} else {
//TODO,待考虑按什么决定角度正负
if (desH > desW) {
s.rotation = -90;
//没设置过居中的
if (!s._stageCenter) s.y = divW
} else {
s.rotation = 90;
//没设置过居中的
if (!s._stageCenter) s.x = divH
}
}
//视窗计算 //视窗计算
s.viewRect = s.viewRect || new Rectangle(); s.viewRect = s.viewRect || new Rectangle();
s.viewRect.x = (s.desWidth - canvas.width / scale) >> 1; s.viewRect.x = (desW - divW / scale) >> 1;
s.viewRect.y = (s.desHeight - canvas.height / scale) >> 1; s.viewRect.y = (desH - divH / scale) >> 1;
s.viewRect.width = s.desWidth - s.viewRect.x * 2; s.viewRect.width = desW - s.viewRect.x * 2;
s.viewRect.height = s.desHeight - s.viewRect.y * 2; s.viewRect.height = desH - s.viewRect.y * 2;
//额外逻辑,不设置舞台居中时,x,y为左上角,置0 //额外逻辑,不设置舞台居中时,x,y为左上角,置0
if (!s._stageCenter) s.viewRect.x = s.viewRect.y = 0; if (!s._stageCenter) s.viewRect.x = s.viewRect.y = 0;
...@@ -464,7 +485,7 @@ export class Stage extends Container { ...@@ -464,7 +485,7 @@ export class Stage extends Container {
// points = [e.changedTouches[0]]; // points = [e.changedTouches[0]];
// points = [e.touches[0]];//不能用这个 // points = [e.touches[0]];//不能用这个
let { x: offsetX, y: offsetY } = s.canvasOffsetTb; let { x: offsetX, y: offsetY } = s.canvasOffsetTb;
//@ts-ignore //
if (getEnv() == "web") { if (getEnv() == "web") {
let doc = document.documentElement; let doc = document.documentElement;
let box = s.canvas.getBoundingClientRect(); let box = s.canvas.getBoundingClientRect();
......
...@@ -295,7 +295,7 @@ export class BatchRenderer extends ObjectRenderer { ...@@ -295,7 +295,7 @@ export class BatchRenderer extends ObjectRenderer {
currentGroup.textureCount = 0; currentGroup.textureCount = 0;
currentGroup.start = 0; currentGroup.start = 0;
// currentGroup.blend = blendMode; currentGroup.blend = blendMode;
TICK++; TICK++;
......
...@@ -427,6 +427,8 @@ export class TextField extends Sprite { ...@@ -427,6 +427,8 @@ export class TextField extends Sprite {
//暂时没开放 //暂时没开放
ctx.textBaseline = "middle"//"top"; ctx.textBaseline = "middle"//"top";
ctx.fillStyle = getRGBA(s._fillColor, s._textAlpha) ctx.fillStyle = getRGBA(s._fillColor, s._textAlpha)
//确保描边样式
ctx.lineJoin = "round";
} }
/** /**
* 获取当前文本中单行文字的宽,注意是文字的不是文本框的宽 * 获取当前文本中单行文字的宽,注意是文字的不是文本框的宽
...@@ -485,6 +487,32 @@ export class TextField extends Sprite { ...@@ -485,6 +487,32 @@ export class TextField extends Sprite {
} }
return width return width
} }
/**
* 根据宽度截取文本,
* 注意调用前需要_prepContext,保证文本属性,否则测量文本宽度有误
* @param str 需要截取的文本
* @param textWidth 截取宽度,不传默认使用本身设置的文本宽度,如未设置不处理
*/
private _cutLines(str: string, textWidth: number = this._textWidth, isOnlyOne: boolean = false): string[] {
let s = this, lines: string[] = [];
let lineStr = str[0];
let strLen = str.length, wordW: number;
for (let j = 1; j < strLen; j++) {
//测量连续字符,而不是单个字符
wordW = s._getMeasuredWidth(lineStr + str[j])
if (wordW > textWidth) {
//加一个
lines.push(lineStr);
if (isOnlyOne) return lines;
//重新赋值
lineStr = str[j];
} else {
lineStr += str[j];
}
}
if (lineStr) lines.push(lineStr);
return lines
}
private realLines: any = []; private callback; private realLines: any = []; private callback;
/** /**
* 更新文本,主要重画canvas,回调是很有问题的 * 更新文本,主要重画canvas,回调是很有问题的
...@@ -542,20 +570,22 @@ export class TextField extends Sprite { ...@@ -542,20 +570,22 @@ export class TextField extends Sprite {
textWidth = textWidth || lineW; textWidth = textWidth || lineW;
//如果设置过textWidth的。截取文本 //如果设置过textWidth的。截取文本
if (lineW > textWidth) { if (lineW > textWidth) {
let w = s._getMeasuredWidth(str[0]); // let w = s._getMeasuredWidth(str[0]);
let lineStr = str[0]; // let lineStr = str[0];
let wordW = 0; // let wordW = 0;
let strLen = str.length; // let strLen = str.length;
for (let j = 1; j < strLen; j++) { // for (let j = 1; j < strLen; j++) {
wordW = s._getMeasuredWidth(str[j])//ctx.measureText(str[j]).width; // wordW = s._getMeasuredWidth(str[j])//ctx.measureText(str[j]).width;
w += wordW; // w += wordW;
if (w > textWidth) { // if (w > textWidth) {
realLines[0] = lineStr; // realLines[0] = lineStr;
break; // break;
} else { // } else {
lineStr += str[j]; // lineStr += str[j];
} // }
} // }
//用新的方法
realLines[0] = s._cutLines(str, textWidth, true)[0];
} }
} else { } else {
//textWidth取每行最大值,如果没设置过textWidth //textWidth取每行最大值,如果没设置过textWidth
...@@ -564,27 +594,34 @@ export class TextField extends Sprite { ...@@ -564,27 +594,34 @@ export class TextField extends Sprite {
let str = hardLines[i]; let str = hardLines[i];
if (!str) continue; if (!str) continue;
textWidth = Math.max(s._getMeasuredWidth(str), textWidth); textWidth = Math.max(s._getMeasuredWidth(str), textWidth);
//下面加else了,这里记录真实每行文本
realLines[realLines.length] = str;
} }
} }
for (let i = 0, l = hardLines.length; i < l; i++) { //设置过_textWidth的,需要检查每行文本宽度,该换行的换行
let str = hardLines[i]; else {
if (!str) continue; for (let i = 0, l = hardLines.length; i < l; i++) {
let w = s._getMeasuredWidth(str[0]); let str = hardLines[i];
let lineStr = str[0]; if (!str) continue;
let wordW = 0; // let w = s._getMeasuredWidth(str[0]);
let strLen = str.length; // let lineStr = str[0];
for (let j = 1; j < strLen; j++) { // let wordW = 0;
wordW = s._getMeasuredWidth(str[j])//ctx.measureText(str[j]).width; // let strLen = str.length;
w += wordW; // for (let j = 1; j < strLen; j++) {
if (w > textWidth) { // wordW = s._getMeasuredWidth(str[j])//ctx.measureText(str[j]).width;
realLines[realLines.length] = lineStr; // w += wordW;
lineStr = str[j]; // if (w > textWidth) {
w = wordW; // realLines[realLines.length] = lineStr;
} else { // lineStr = str[j];
lineStr += str[j]; // w = wordW;
} // } else {
// lineStr += str[j];
// }
// }
// realLines[realLines.length] = lineStr;
//用新的方法
realLines.push(...s._cutLines(str, textWidth));
} }
realLines[realLines.length] = lineStr;
} }
} }
let lineH = this.lineHeight; let lineH = this.lineHeight;
......
...@@ -399,6 +399,7 @@ export class ScrollPage extends Container { ...@@ -399,6 +399,7 @@ export class ScrollPage extends Container {
s.autoScroll = true; s.autoScroll = true;
s.isStop = true; s.isStop = true;
s.isMouseDownState = 0; s.isMouseDownState = 0;
Tween.removeTweens(s.view)
Tween.get(s.view) Tween.get(s.view)
.to({ [s.paramXY]: -dis }, time) .to({ [s.paramXY]: -dis }, time)
.call(() => { .call(() => {
......
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