Commit 54433341 authored by rockyl's avatar rockyl

修改zeroing

parent d7737d04
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -13,21 +13,25 @@ let stage = new render.Stage(
//启动循环
render.Stage.flushAll();
let node = new render.Node();
node.width = 400;
console.log(node.width);
/*let gameStage = new render.GameStage(stage);
let gameStage = new render.GameStage(stage);
stage.addChild(gameStage);
let sceneEntry = new render.Container();
let bg = new render.Shape();
bg.beginFill(0xFF8888);
bg.drawRect(0, 0, 300, 300);
bg.endFill();
sceneEntry.percentWidth = 100;
sceneEntry.percentHeight = 100;
let bg = new render.Rect();
bg.percentWidth = 100;
bg.percentHeight = 100;
bg.fillColor = 'gray';
sceneEntry.addChild(bg);
gameStage.sceneContainer.push(sceneEntry);*/
let ball = new render.Circle();
ball.radius = 50;
ball.fillColor = 'green';
sceneEntry.addChild(ball);
gameStage.sceneContainer.push(sceneEntry);
/*let dialog = new render.Container();
let dbg = new render.Shape();
......
......@@ -2,61 +2,72 @@
<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" />
<!-- <meta name="viewport" content="width=device-width,minimum-scale=1.0,user-scalable=no"> -->
<style>
html,
body {
padding: 0;
margin: 0;
border: 0;
width: 100%;
height: 100%;
overflow: hidden;
position: absolute;
background-color: white;
}
/* .top {
width: 100%;
height: 100px;
} */
</style>
<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"/>
<!-- <meta name="viewport" content="width=device-width,minimum-scale=1.0,user-scalable=no"> -->
<style>
html,
body {
padding: 0;
margin: 0;
border: 0;
width: 100%;
height: 100%;
overflow: hidden;
position: absolute;
background-color: white;
}
/* .top {
width: 100%;
height: 100px;
} */
</style>
</head>
<body>
<script type="text/javascript" src="./build/render.min.js"></script>
<div id="cusEngine" style="line-height:0;font-size:0"></div>
<script>
<script type="text/javascript" src="./build/render.min.js"></script>
<div id="cusEngine" style="line-height:0;font-size:0"></div>
<script>
var stage = new render.Stage(
"cusEngine",
750,
1206,
60,
render.StageScaleMode.FIXED_WIDTH,
render.RENDERER_TYPE.WEBGL
);
//启动循环
render.Stage.flushAll();
stage.addChild(render.Sprite.from("./11.png"));
var stage = new render.Stage(
"cusEngine",
750,
1334,
60,
render.StageScaleMode.FIXED_WIDTH,
render.RENDERER_TYPE.WEBGL
);
//启动循环
render.Stage.flushAll();
</script>
let image = render.Sprite.from("./11.png");
image.anchorX = 100;
stage.addChild(image);
/*let rect = new render.Shape();
rect.beginFill(0x00ffff);
rect.drawRect(0, 0, 100, 100);
rect.endFill();
rect.anchorX = 50;
//rect.x = 200;
//rect.y = 200;
stage.addChild(rect);*/
</script>
</body>
</body>
</html>
\ No newline at end of file
import { DisplayObject } from './DisplayObject';
import { Rectangle } from "../math/Rectangle";
import { Point } from '../math';
import {DisplayObject} from './DisplayObject';
import {Rectangle} from "../math/Rectangle";
import {Point} from '../math';
import CanvasRenderer from '../renderers/CanvasRenderer';
import { Event } from "../events/Event"
import { WebglRenderer } from '../renderers/WebglRenderer';
import {Event} from "../events/Event"
import {WebglRenderer} from '../renderers/WebglRenderer';
import {applyAutoAdjust} from "../../zeroing/auto-adjust";
/**
* 容器类
* @class
* @extends DisplayObject
*/
@applyAutoAdjust
export default class Container extends DisplayObject {
/**
......@@ -549,9 +551,11 @@ export default class Container extends DisplayObject {
// } else {
// this.scale.x = 1;
// }
if (this._width !== value) this.dispatchEvent(Event.RESIZE)
//子类有用,有_width,才需设置scaleX
this._width = value
if (this._width !== value) {
//子类有用,有_width,才需设置scaleX
this._width = value;
this.dispatchEvent(Event.RESIZE);
}
}
/**
......@@ -570,8 +574,10 @@ export default class Container extends DisplayObject {
// } else {
// this.scale.y = 1;
// }
if (this._height !== value) this.dispatchEvent(Event.RESIZE)
this._height = value
if (this._height !== value) {
this._height = value;
this.dispatchEvent(Event.RESIZE);
}
}
//全局遍历
......
......@@ -327,7 +327,7 @@ export class Shape extends Sprite {
* @since 1.0.0
*/
public beginFill(color: number, alpha: number = 1): void {
var sColor = getRGBA(hex2string(color), alpha);
var sColor = typeof color === 'string' ? color : getRGBA(hex2string(color), alpha);
this._fill(sColor);
}
......@@ -398,7 +398,7 @@ export class Shape extends Sprite {
miter: number = 0,
alpha: number = 1
): void {
var sColor = getRGBA(hex2string(color), alpha);
var sColor = typeof color === 'string' ? color : getRGBA(hex2string(color), alpha);
this._stroke(sColor, lineWidth, cap, join, miter);
}
......
......@@ -116,7 +116,6 @@ export class TextField extends Sprite {
this._textWidth = value;
this.dirty = true;
}
;
}
public get textWidth(): number {
......
......@@ -18,7 +18,9 @@ export class GameStage extends Container {
super();
this._stage = stage;
stage.addEventListener(Event.RESIZE, this._onStageResize, this);
this['percentWidth'] = 100;
this['percentHeight'] = 100;
this.addChild(this._sceneContainer = new StackContainer());
this.addChild(this._popupContainer = new StackContainer());
......@@ -37,10 +39,4 @@ export class GameStage extends Container {
get popupContainer(): StackContainer {
return this._popupContainer;
}
private _onStageResize(e) {
const {desWidth, desHeight} = this._stage;
this.width = this._sceneContainer.width = this._popupContainer.width = desWidth;
this.height = this._sceneContainer.height = this._popupContainer.height = desHeight;
}
}
......@@ -8,6 +8,13 @@ import {Container, DisplayObject} from "../2d/display";
* 栈式视图容器
*/
export class StackContainer extends Container {
constructor(){
super();
this['percentWidth'] = 100;
this['percentHeight'] = 100;
}
/**
* 推入视图
* @param view
......
......@@ -8,6 +8,8 @@ import {Event} from "../2d/events";
* 自适应数据
*/
export class AdjustData {
percentWidth: number = NaN;
percentHeight: number = NaN;
left: number = NaN;
top: number = NaN;
right: number = NaN;
......@@ -16,26 +18,101 @@ export class AdjustData {
verticalCenter: number = NaN;
}
function t(v) {
return !isNaN(v) && v !== null && v !== undefined;
}
/**
* 应用自适应
* @param ctor
*/
export function applyAutoAdjust(ctor: Function) {
let adjustData = new AdjustData();
ctor.prototype.afterConstructor = function () {
let adjustData = new AdjustData();
this.__sizeDirty = true;
this.adjustData = adjustData;
this.addEventListener(Event.RESIZE, this.__onResize, this);
this.addEventListener(Event.ADDED_TO_STAGE, this.__onAddedToStage, this);
this.addEventListener(Event.REMOVED_FROM_STAGE, this.__onRemovedFromStage, this);
};
ctor.prototype.__onAddedToStage = function () {
this.parent.addEventListener(Event.RESIZE, this.__onResize, this);
this.addEventListener(Event.ENTER_FRAME, this.__onEnterFrame, this);
};
ctor.prototype.__onRemovedFromStage = function () {
this.parent.removeEventListener(Event.RESIZE, this.__onResize);
this.removeEventListener(Event.ENTER_FRAME, this.__onEnterFrame);
};
ctor.prototype.__onResize = function () {
console.log(this.width, this.height);
this.__sizeDirty = true;
};
ctor.prototype.__onEnterFrame = function () {
if (this.__sizeDirty) {
this.__sizeDirty = false;
const that = this;
const {width: pWidth, height: pHeight} = this.parent;
const {width, height} = this;
const {percentWidth, percentHeight, left, top, right, bottom, horizonCenter, verticalCenter} = this.adjustData;
const applyPercentWidth = function () {
if (t(percentWidth)) {
that.width = pWidth * percentWidth / 100;
}
};
const applyPercentHeight = function () {
if (t(percentHeight)) {
that.height = pHeight * percentHeight / 100;
}
};
let pw = true, ph = true;
if (t(horizonCenter)) {
applyPercentWidth();
this.x = (pWidth - this.width) / 2 + horizonCenter;
} else {
if (t(left)) {
this.x = left;
if (t(right)) {
this.width = pWidth - left - right;
pw = false;
}
} else if (t(right)) {
this.x = pWidth - width - right;
}
if (pw) {
applyPercentWidth();
}
}
if (t(verticalCenter)) {
applyPercentHeight();
this.y = (pHeight - this.height) / 2 + verticalCenter;
} else {
if (t(top)) {
this.y = top;
if (t(bottom)) {
this.height = pHeight - top - bottom;
ph = false;
}
} else if (t(bottom)) {
this.y = pHeight - height - bottom;
}
if (ph) {
applyPercentHeight();
}
}
}
};
for (let key in adjustData)
for (let key in new AdjustData())
Object.defineProperty(ctor.prototype, key, {
get: function () {
return this.adjustData[key];
},
set: function (v) {
this.adjustData[key] = v;
if (this.adjustData[key] !== v) {
this.adjustData[key] = v;
this.__sizeDirty = true;
}
},
enumerable: true,
configurable: true
......
/**
* Created by rockyl on 2018/11/9.
*
* 装饰器
*/
/**
* 属性修改时触发
* @param onModify
*/
export function fieldChanged(onModify) {
return function (target: any, key: string) {
const privateKey = '_' + key;
Object.defineProperty(target, key, {
enumerable: true,
get: function () {
return this[privateKey];
},
set: function (v) {
const oldValue = this[privateKey];
if (oldValue !== v) {
this[privateKey] = v;
onModify.apply(this, [v, key, oldValue]);
}
}
})
}
}
/**
* 属性变脏时设置宿主的dirty属性为true
*/
export const dirtyFieldDetector = fieldChanged(
function (value, key, oldValue) {
this['__fieldDirty'] = true;
}
);
/**
* 深度属性变脏时设置宿主的dirty属性为true
*/
export const deepDirtyFieldDetector = fieldChanged(
function (value, key, oldValue) {
const scope = this;
scope['__fieldDirty'] = true;
if (typeof value === 'object') {
value['onModify'] = function(){
scope['__fieldDirty'] = true;
};
}
}
);
/**
* 属性变脏时触发onModify方法
*/
export const dirtyFieldTrigger = fieldChanged(
function (value, key, oldValue) {
this['onModify'] && this['onModify'](value, key, oldValue);
}
);
/**
* 深入属性变脏时触发onModify方法
*/
export const deepDirtyFieldTrigger = fieldChanged(
function (value: any, key, oldValue) {
if (this['onModify']) {
this['onModify'](value, key, oldValue);
if (typeof value === 'object') {
value['onModify'] = this['onModify'];
}
}
}
);
......@@ -4,4 +4,4 @@
export * from './GameStage'
export * from './StackContainer'
export * from './nodes'
\ No newline at end of file
export * from './shapes'
/**
* Created by rockyl on 2019-11-06.
*/
import {Container} from "../../2d/display";
import {applyAutoAdjust} from "../auto-adjust";
/**
* 节点
*/
@applyAutoAdjust
export class Node extends Container {
}
/**
* Created by rockyl on 2019-11-06.
*/
export * from './Node'
/**
* Created by rockyl on 2019-11-06.
*/
import {Shape} from "..";
import {Event} from "../2d/events";
import {dirtyFieldDetector} from "./decorators";
/**
* 图形基类
*/
class ShapeBase extends Shape {
protected __fieldDirty = true;
@dirtyFieldDetector
fillColor: any = 0;
@dirtyFieldDetector
strokeColor: any = 0;
@dirtyFieldDetector
strokeWidth: number = 0;
constructor() {
super();
this.addEventListener(Event.ENTER_FRAME, this.onEnterFrame, this);
this.addEventListener(Event.RESIZE, this.onResize, this);
}
private onResize(e) {
this.__fieldDirty = true;
}
private onEnterFrame(e) {
if (this.__fieldDirty) {
this.__fieldDirty = false;
const {fillColor, strokeColor, strokeWidth} = this;
this.clear();
this.beginFill(fillColor);
if (strokeWidth > 0) {
this.beginStroke(strokeColor, strokeWidth);
}
this.redraw();
this.endFill();
if (strokeWidth > 0) {
this.endStroke();
}
}
}
protected redraw() {
}
}
/**
* 矩形
*/
export class Rect extends ShapeBase {
@dirtyFieldDetector
borderRadius: number = 0;
protected redraw() {
const {width, height, borderRadius,} = this;
if (borderRadius > 0) {
this.drawRoundRect(0, 0, width, height, borderRadius, borderRadius, borderRadius, borderRadius)
} else {
this.drawRect(0, 0, width, height);
}
}
}
/**
* 圆形
*/
export class Circle extends ShapeBase {
@dirtyFieldDetector
radius: number = 0;
protected redraw() {
super.redraw();
const {radius} = this;
this.drawCircle(radius, radius, radius);
}
}
......@@ -65,7 +65,6 @@ export declare class DisplayObject extends EventDispatcher {
mask: Graphics;
width: number;
height: number;
protected dispatchResizeEvent(): void;
private _components;
update(): void;
addComponent(component: Component): void;
......
......@@ -29,8 +29,6 @@ export default class Sprite extends Container {
getLocalBounds(rect?: Rectangle): Rectangle;
hitTestPoint(globalPoint: Point, isMouseEvent?: boolean): any;
destroy(): void;
width: number;
height: number;
anchorTexture: any;
texture: Texture;
static from(source: any): Sprite;
......
......@@ -81,8 +81,6 @@ export default class Graphics extends Container {
updateLocalBoundsSelf(): void;
private generateCanvasTexture;
destroy(): void;
width: number;
height: number;
private proccessHoles;
private addUvs;
private adjustUvs;
......
......@@ -24,11 +24,11 @@ module.exports = {
},
devtool: 'source-map',
plugins: [
new UglifyJSPlugin(
/*new UglifyJSPlugin(
{ sourceMap: true }
), new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
})
})*/
],
resolve: {
extensions: ['.webpack.js', '.web.js', '.ts', '.js']
......
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