前言
好几天没写,刚到新公司要好好工作,尽快熟悉环境和项目.这里补一个Torque例子中没有说到的,那就是具体的界面自创建(当然SandBox里面有,但是不是那么明显,因为载体窗口是从gui.taml中加载的).
现在给一份我做塔防时,需要的一个箭塔操作面板,目前有两种功能,升级和变卖.代码如下:
代码片段
// ------------------------------------------------------- // 文件名: TowerOperatePanel.cs // 描 述: 塔楼操作面板界面 // 日 期: 17/3/2013 // 作 者: KevinYuen // 版 权: Copyright (C) 2011 - All Rights Reserved // 备 注: // ------------------------------------------------------- // 制作塔楼操作面板 function MakeTowerOperatePanel() { // 载体窗口创建 %panel = new GuiControl() { HorizSizing="relative"; VertSizing="relative"; Position="0 0"; Extent="120 60"; Visible="1"; Active="1"; isContainer = "0"; useMouseEvents = "0"; BindTower = ""; // 绑定的塔楼 }; // 升级按钮创建 %button = new GuiImageButtonCtrl() { class = "LevelupTowerButton"; internalName = "TowerPanel.Levelup"; Profile="GuiDefaultProfile"; HorizSizing="relative"; VertSizing="relative"; Position="0 0"; isContainer = "0"; useMouseEvents = "0"; Extent="60 60"; Visible="1"; Active="1"; buttonType="PushButton"; NormalImage="Game:LevelupBtnNormal"; HoverImage="Game:LevelupBtnHoverd"; DownImage="Game:LevelupBtnNormal"; InactiveImage="Game:LevelupBtnInactive"; }; %panel.addGuiControl( %button ); // 变卖按钮创建 %sellBtn = new GuiImageButtonCtrl() { class = "SellTowerButton"; internalName = "TowerPanel.Sell"; Profile="GuiDefaultProfile"; HorizSizing="relative"; VertSizing="relative"; Position="60 0"; isContainer = "0"; useMouseEvents = "0"; Extent="60 60"; Visible="1"; Active="1"; buttonType="PushButton"; NormalImage="Game:SellBtnNormal"; HoverImage="Game:SellBtnHoverd"; DownImage="Game:SellBtnNormal"; InactiveImage="Game:SellBtnInactive"; }; %panel.addGuiControl( %sellBtn ); //TamlWrite( %panel, "TowerOpPanel.gui.taml" ); // 加入窗口管理 //Game.MainWindow.add( %panel ); // 设置为模块变量 Game.TowerOperatePanel = %panel; // 舞台退出时销毁 Game.ActiveStage.ScopeSet.add( %panel ); // 隐藏 %panel.setVisible( 0 ); } // 显示塔楼控制面板 function ShowTowerOperatePanel( %tower ) { // 如果是第一次创建 if( !isObject( Game.TowerOperatePanel ) ) MakeTowerOperatePanel(); CloseTowerOperatePanel(); // 按钮有效性设定 %levBtn = Game.TowerOperatePanel.findObjectByInternalName( "TowerPanel.Levelup" ); %levBtn.setActive( true ); if( %tower.Level >= %tower.MaxLevel ) { %levBtn.setActive( false ); } Game.TowerOperatePanel.setVisible( 1 ); // 绑定到对象 %tower.attachGUI( Game.TowerOperatePanel, Game.MainWindow, false ); Game.TowerOperatePanel.BindTower = %tower; } // 关闭塔楼控制面板 function CloseTowerOperatePanel() { if( isObject( Game.TowerOperatePanel ) ) { Game.TowerOperatePanel.setVisible( 0 ); // 如果有绑定的对象,则要松绑 if( isObject( Game.TowerOperatePanel.BindTower ) ) { Game.TowerOperatePanel.BindTower.detachGui(); Game.TowerOperatePanel.BindTower = ""; } } } // 升级点击 function LevelupTowerButton::onClick( %this ) { echo( "LevelupTowerButton::onClick" ); %tower = Game.TowerOperatePanel.BindTower; %upgradeBehavior = %tower.getBehavior( $ObjectSystem::BehaviorUpgrade ); if( isObject( %upgradeBehavior ) ) { %ret = %upgradeBehavior.Upgrade( 1 ); echo( "Tower upgrad result: " @ %ret @ " current level is:" @ %tower.Level ); } CloseTowerOperatePanel(); } // 变卖点击 function SellTowerButton::onClick( %this ) { echo( "SellTowerButton::onClick" ); // 变卖操作 // 删除对象 Game.TowerOperatePanel.BindTower.safeDelete(); // 面板关闭 CloseTowerOperatePanel(); }
关于界面系统
Torque2D 2.0的界面系统是从老项目中挪过来的,如果要配合脚本使用,在没有编辑器的情况下,非常麻烦,不仅要创建自己的profile,还要对位置等等.
我也问过作者,他们说以后会大改,不过现在他们在搞Taml的Schema和Qt壳的编辑器设计,没有时间,如果你要等待新系统,那就有的等了,这都是没影子的事情.
不过他们给了建议,就是简单的界面可以直接使用Sprite来实现,这样表现和灵活性上都比单纯的GuiControl要好很多,但是复杂带层结构的界面就比较麻烦了,他们没说.
比如: 用什么排序方式,如果剪裁等等,在不改动源代码的基础上怎么做,等等..
截图
由于SceneObject::attachGUI并没有提供偏移值的参数,后面也没有增加的想法,所以这里的表现效果差强人意,自己在界面上做偏移吧~