Torque2D MIT 学习笔记(20) ---- 一个界面编写和事件响应的例子
前言
好几天没写,刚到新公司要好好工作,尽快熟悉环境和项目.这里补一个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并没有提供偏移值的参数,后面也没有增加的想法,所以这里的表现效果差强人意,自己在界面上做偏移吧~
浙公网安备 33010602011771号