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

  • 相关阅读:
    [LeetCode] Contains Duplicate 包含重复值
    [LeetCode] 281. The Skyline Problem 天际线问题
    Qt resizeEvent 控件居中设置
    [LeetCode] 214. Shortest Palindrome 最短回文串
    Qt Creator Shortcuts 快捷键大全
    Qt SizePolicy 属性
    [LeetCode] 30. Substring with Concatenation of All Words 串联所有单词的子串
    [LeetCode] 213. House Robber II 打家劫舍之二
    [LeetCode] 212. Word Search II 词语搜索之二
    [LeetCode] 18. 4Sum 四数之和
  • 原文地址:https://www.cnblogs.com/KevinYuen/p/2976723.html
Copyright © 2011-2022 走看看