import { Greeter } from './test/Greeter'; import { Project } from '../../module/project/data/Project'; import { Global } from '../../utils/Global'; import { Paths } from '../../utils/Paths'; import { MessageUtils, Message } from '../../module/message/MessageUtils'; import { PropertyMessage } from '../../module/property/events/PropertyMessage'; import { GameUIScene } from '../../module/project/data/GameUIScene'; import { GameUIObject } from '../../module/project/data/GameUIObject'; import { GameUIComponent } from '../../module/project/data/GameUIComponent'; import { TsParser, Props, IDecorator } from '../../module/property/view/TsParser'; import { ProjectMessage } from '../../module/project/events/ProjectMessage'; import { FileUtils } from '../../utils/FileUtils'; import { Utils } from '../../utils/Utils'; import { Transformer } from './transformers/Transformer'; import electron from 'electron'; import { SceneMessage } from './events/SceneMessage'; import { message } from 'antd'; const gaze = require('gaze'); const ipcRender = require('electron').ipcRenderer; import fs = require('fs'); import path = require('path'); // import '../../../doc/examples/game/runtime/bin-debug/plugins/Flash'; // import '../../../doc/examples/game/runtime/bin-debug/plugins/Rotate'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/Bullet.ts'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/Flash.ts'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/Rotate'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript1'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript2'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript3'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript4'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript5'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript6'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript7'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript8'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript9'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript10'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript11'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript12'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript13'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript14'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript15'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript16'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript17'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript18'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript19'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript20'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript21'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript22'; // import 'E:/project/lakeshore-electron/doc/examples/game/runtime/src/plugins/NewComponentScript23'; /** * 编辑模式显示 * 场景加入完毕之后,需要初始化来编译一下所有的ts,以防止可能以别的软件打开项目,加入了一些属性,而没有更新配置 * 因为默认是从配置来读取的 */ export class SceneRender extends egret.Sprite { private scene: els.Scene; private onTouchGameObject: els.GameObject; private touchDown: boolean; private touchOffsetX: number; private touchOffsetY: number; private transformer: Transformer; constructor() { super(); this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this); this.onRPCReceived(); //注册消息 this.registerMessage(); } private onAddToStage(event: egret.Event): void { //渲染背景 this.setBackground(); } registerMessage() { MessageUtils.register(ProjectMessage.INSERT_COMPONENT, this.onMessage, this); MessageUtils.register(SceneMessage.SCENE_INITIALIZE, this.onMessage, this); MessageUtils.register(SceneMessage.RIGHT_CLICK, this.onMessage, this); MessageUtils.register(SceneMessage.SCENE_ADD_GAMEOBJECT, this.onMessage, this); MessageUtils.register(SceneMessage.SCENE_REMOVE_GAMEOBJECT, this.onMessage, this); MessageUtils.register(SceneMessage.SCENE_UPDATE_GAMEOBJECT, this.onMessage, this); } private onMessage(message: Message) { switch (message.type) { case ProjectMessage.INSERT_COMPONENT: this.onComponentsListner(); break; case SceneMessage.SCENE_INITIALIZE: //渲染游戏对象 this.renderGameobjects(); break; case SceneMessage.RIGHT_CLICK: this.onGameObjectListner(message.data); break; case SceneMessage.SCENE_ADD_GAMEOBJECT: this.onGameobjectAdd(message.data); break; case SceneMessage.SCENE_REMOVE_GAMEOBJECT: this.onGameObjectRemove(message.data); break; case SceneMessage.SCENE_UPDATE_GAMEOBJECT: this.onGameObjectUpdate(message.data); break; } } private renderGameobjects(): void { // require('../../../doc/examples/game/runtime/bin-debug/plugins/Flash'); // require('../../../doc/examples/game/runtime/bin-debug/plugins/Rotate'); // require('../../../doc/examples/game/runtime/bin-debug/plugins/Bullet'); // console.log(path.normalize('../../../doc/examples/game/runtime/bin-debug/plugins/Flash')); //初始化场景对象 let project: Project = Global.currentProject; let currentUIScene: GameUIScene = project.getGameUIScene(project.currentSceneName); this.transformer = new Transformer(); this.transformer.onSelect = this.onTransformerSelected.bind(this); this.scene = els.Scene.getInstance(); project.currentScene = this.scene; this.addChild(this.scene.renderContainer); this.scene.switchScene(Paths.getSceneDirectory(currentUIScene.name), () => { this.transformer.register(this.scene.children); this.onComponentsListner(); this.onBindGameObject(); }, this, true); currentUIScene.data = this.scene; this.addChild(this.transformer); } //添加游戏对象 private onGameobjectAdd(data: { parent: GameUIObject, target: GameUIObject }) { if (data.parent) { let parentGameObject: els.GameObject = data.parent.data; let gameobject: els.GameObject = new els.GameObject(data.target.name); gameobject.UID = data.target.UID; data.target.data = gameobject; for (let key in data.target.transform) { gameobject.transform[key] = data.target.transform[key]; } parentGameObject.addChild(gameobject); //添加组件 if (data.target.components) { for (let i: number = 0, l: number = data.target.components.length; i < l; i++){ let gameuiComponent: GameUIComponent = data.target.components[i]; let compName: string = gameuiComponent.name; let componentClass = egret.getDefinitionByName(compName); if (componentClass) { let compinst: els.Component = new componentClass(); compinst.name = compName; compinst.gameobject = gameobject; gameobject.addComponent(compinst); } } } els.Scene.getInstance()['_uigameobjectHash'][data.target.UID] = gameobject; } } private onGameObjectRemove(data) { } private onGameObjectUpdate(data) { } private onTransformerSelected(select: els.GameObject) { MessageUtils.send(PropertyMessage.SHOW_GAMEOBJECT_PROPERTY, select); } private onGameObjectListner(data: { clientX: number, clientY: number }) { for (let i: number = 0, l: number = this.scene.children.length; i < l; i++){ let gameobject: els.GameObject = this.scene.children[i]; let rect: egret.Rectangle = new egret.Rectangle(gameobject.x + 450, gameobject.y, gameobject.width, gameobject.height); if (rect.contains(data.clientX, data.clientY)) { console.log(data.clientX, data.clientY); } } } /** 将游戏对象GameObject绑定给GameUIObject */ private onBindGameObject() { let project: Project = Global.currentProject; let uiScenes: GameUIScene[] = project.uiScenes; let scene: els.Scene = project.currentScene; for (let i: number = 0, l: number = uiScenes.length; i < l; i++){ let uiScene: GameUIScene = uiScenes[i]; uiScene.data = project.currentScene; if (project.currentSceneName !== uiScene.name) continue; if (!uiScene.children) continue; for (let j: number = 0, jl: number = uiScene.children.length; j < jl; j++){ let uiGameobject: GameUIObject = uiScene.children[j]; this._onBindGameobject(uiGameobject, scene); } } } private _onBindGameobject(uiGameobject:GameUIObject,scene:els.Scene) { uiGameobject.data = scene.getGameobjectByUID(uiGameobject.UID); if (uiGameobject.children) { for (let i: number = 0, l: number = uiGameobject.children.length; i < l; i++){ this._onBindGameobject(uiGameobject.children[i], scene); } } } /** 监听所有组件是否有改变,如果有改变,通过,tsc来分析改变的文件,再更新内存 */ private onComponentsListner() { let scenes: any[] = Global.currentProject.uiScenes; let analyzeComponentHash: any = {}; for (let i: number = 0, l: number = scenes.length; i < l; i++) { let uiScene: GameUIScene = scenes[i]; for (let j: number = 0, jl: number = uiScene.children.length; j < jl; j++) { let gameobject: GameUIObject = uiScene.children[j]; for (let k: number = 0, kl: number = gameobject.components.length; k < kl; k++) { let uiComponent: GameUIComponent = gameobject.components[k]; if (analyzeComponentHash[uiComponent.name] === undefined) analyzeComponentHash[uiComponent.name] = uiComponent; } } } let analyzeSources: string[] = []; for (let name in analyzeComponentHash) { analyzeSources.push(Paths.getComponentUrlByName(name)); } let self: SceneRender = this; //分析文件列表 gaze(analyzeSources, function (err, watcher) { let watched = this.watched(); this.on('changed', function (filepath: string) { filepath = path.normalize(filepath); let splits: string[] = filepath.split('//'); let componentName: string = splits[splits.length - 1].split('.')[0]; let tscParser: TsParser = new TsParser(); let transpileOutput = tscParser.transpileFile(filepath); FileUtils.save(Paths.getComponentOutputUrlByName(componentName), transpileOutput.outputText, (result) => { if (!result) throw Error('保存ts文件' + componentName + '发生错误:'); //分析tsc语法 self.tscAnalyze(filepath,componentName); }); }); }); } private tscAnalyze(url: string,componentName:string) { let tsParser: TsParser = new TsParser(); tsParser.parseFiles([url]); let datas = tsParser.getClassDataMap(); let classInfo = datas[componentName]; let contentWindow: Window = Global.contentWindow; if (classInfo) { let classNode = classInfo.classNode; let props: any = classNode.props; let methods: any = classNode.methods; if (props) { for (let propkey in props) { let prop = props[propkey]; let decorators: IDecorator[] = prop.decorators; if (!decorators) continue; if (decorators && decorators.length) { if (contentWindow) { for (let i: number = 0, l: number = decorators.length; i < l; i++) { let decorator = decorators[i]; let className: string = decorator.className; let propertyName: string = propkey; let callName: string = decorator.callName; let decoratorArguments: any[] = decorator.arguments; if (decoratorArguments) { let argValues: any[] = []; for (let j: number = 0, jl: number = decoratorArguments.length; j < jl; j++) { let argValue = decoratorArguments[j].value; argValues[j] = argValue; } let callClass = Global.egret.getDefinitionByName(className); Utils.decorate([(contentWindow[callName] as Function).apply(contentWindow, argValues)], callClass.prototype, propertyName, undefined); } } } } else { let callClass = Global.egret.getDefinitionByName(componentName); Global.els.ComponentPropertyMaps.removePropertyRender(callClass.prototype, propkey); } } } if (methods) { for (let name in methods) { let decorators: IDecorator[] = methods[name].decorators; if (!decorators) continue; if (decorators && decorators.length) { for (let i: number = 0, l: number = decorators.length; i < l; i++) { let decorator = decorators[i]; let decoratorArguments: any[] = decorator.arguments; if (decoratorArguments) { let argValues: any[] = []; for (let j: number = 0, jl: number = decoratorArguments.length; j < jl; j++) { let argValue = decoratorArguments[j].value; if(parseFloat(argValue)===0) delete els.editorRuns[componentName]; else { els.editorRuns[componentName] = { callName: 'tick' }; } } } } } } } //更新属性内存 MessageUtils.send(PropertyMessage.UPDATE_COMPONENT_PROPERTY, { componentName: componentName, props: props }); } } onRPCReceived() { ipcRender.on("on-scene-select-callback", (sender, data: [string]) => { let type: string = data[0]; switch (type) { case "copy": break; case "parse": break; case "clone": break; case "delete": break; case "layer-move-top": break; case "layer-move-bottom": break; case "layer-move-up": break; case "layer-move-down": break; case "object-align-top-align": break; case "object-align-bottom-align": break; case "object-align-left-align": break; case "object-align-right-align": break; case "object-align-center-align": break; case "object-align-middle-align": break; case "object-distribution-top": break; case "object-distribution-bottom": break; case "object-distribution-left": break; case "object-distribution-right": break; case "object-distribution-center": break; case "object-distribution-middle": break; case "object-match-width": break; case "object-match-height": break; case "object-match-width-height": break; case "object-space-vertical": break; case "object-space-horizontal": break; case "stage-align-top-align": break; case "stage-align-bottom-align": break; case "stage-align-left-align": break; case "stage-align-right-align": break; case "stage-align-center-align": break; case "stage-align-middle-align": break; case "stage-distribution-top": break; case "stage-distribution-bottom": break; case "stage-distribution-left": break; case "stage-distribution-right": break; case "stage-distribution-center": break; case "stage-distribution-middle": break; case "stage-match-width": break; case "stage-match-height": break; case "stage-match-width-height": break; case "stage-space-vertical": break; case "stage-space-horizontal": break; case "scene-align-top-align": break; case "scene-align-bottom-align": break; case "scene-align-left-align": break; case "scene-align-right-align": break; case "scene-align-center-align": break; case "scene-align-middle-align": break; case "scene-distribution-top": break; case "scene-distribution-bottom": break; case "scene-distribution-left": break; case "scene-distribution-right": break; case "scene-distribution-center": break; case "scene-distribution-middle": break; case "scene-match-width": break; case "scene-match-height": break; case "scene-match-width-height": break; case "scene-space-vertical": break; case "scene-space-horizontal": break; case "scene-select-all": break; case "scene-unselect": break; } }); } private setBackground(): void { this.graphics.clear(); this.graphics.beginFill(0x252525); this.graphics.drawRect(0, 0, this.stage.stageWidth, this.stage.stageHeight); this.graphics.endFill(); } } window['SceneRender'] = SceneRender;