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并没有提供偏移值的参数,后面也没有增加的想法,所以这里的表现效果差强人意,自己在界面上做偏移吧~

原文地址:https://www.cnblogs.com/KevinYuen/p/2976723.html