import { TransformerPointRender, ITransformerMove } from './TransformerPointRender'; import { MessageUtils } from '../../../module/message/MessageUtils'; import { PropertyMessage } from '../../../module/property/events/PropertyMessage'; export class SceneTargetTransformer extends egret.Sprite { private _target: els.GameObject; private _pointRenders: TransformerPointRender[]; private _points: egret.Point[]; constructor() { super(); this.initPointRenders(); } private initPointRenders() { this._pointRenders = []; for (let i: number = 0; i < 8; i++) { let pointRender: TransformerPointRender = new TransformerPointRender(i); pointRender.onMove = this.onMove.bind(this); this._pointRenders[i] = pointRender; this.addChild(pointRender); } } /** * 判断是否有对象被按下 */ get isTouchDown() { for (let i: number = 0; i < 8; i++) { let pointRender: TransformerPointRender = this._pointRenders[i]; if (pointRender.isTouchDown) return true; } return false; } /** * 0---1---2 * | | * 7 3 * | | * 6---5---4 */ onMove(transformerMove: ITransformerMove) { if (!this._target) return; let transformerPoint = transformerMove.target; let dx: number = transformerMove.dx; let dy: number = transformerMove.dy; switch (transformerPoint.type) { case 0://左上 this._target.anchorOffsetX -= dx; this._target.width -= dx; this._target.anchorOffsetY -= dy; this._target.height -= dy; break; case 1://中上 this._target.anchorOffsetY -= dy; this._target.height -= dy; break; case 2://右上 this._target.anchorOffsetY -= dy; this._target.height -= dy; this._target.width += dx; break; case 3://左中 this._target.width += dx; break; case 4://左下 this._target.width += dx; this._target.height += dy; break; case 5://中下 this._target.height += dy; break; case 6://右下 this._target.anchorOffsetX -= dx; this._target.width -= dx; this._target.height += dy; break; case 7://右中 this._target.anchorOffsetX -= dx; this._target.width -= dx; break; } this.update(); } set target(value: els.GameObject) { if (this._target != value) { this._target = value; this.update(); } } update() { if (!this._target) return; let _container: egret.DisplayObjectContainer = this._target.renderer; if (!_container) return; let _rect: egret.Rectangle = this._target.getTransformedBounds(_container.stage); this._points = [ new egret.Point(_rect.x, _rect.y), new egret.Point(_rect.x + _rect.width / 2, _rect.y), new egret.Point(_rect.right, _rect.y), new egret.Point(_rect.right, _rect.y + _rect.height / 2), new egret.Point(_rect.right, _rect.bottom), new egret.Point(_rect.x + _rect.width / 2, _rect.bottom), new egret.Point(_rect.x, _rect.bottom), new egret.Point(_rect.x, _rect.y + _rect.height / 2) ]; this.graphics.clear(); this.graphics.lineStyle(1, 0x00debc); for (let i: number = 0; i < 8; i++) { let pointRender: TransformerPointRender = this._pointRenders[i]; let _point: egret.Point = this._points[i]; pointRender.x = _point.x; pointRender.y = _point.y; //绘制线条 if (i === 0) { this.graphics.moveTo(_point.x, _point.y); } else { this.graphics.lineTo(_point.x, _point.y); } } this.graphics.lineTo(this._points[0].x, this._points[1].y); this.graphics.endFill(); MessageUtils.send(PropertyMessage.UPDATE_TRANSFORM_PROPERTY, { target: this._target, propertys: { x: this._target.x, y: this._target.y, width: this._target.width, height: this._target.height, anchorOffsetX: this._target.anchorOffsetX, anchorOffsetY: this._target.anchorOffsetY, rotation: 0 } }); } }