Magic3D(MyGUI)简单使用
Magic3D(MyGUI)简单使用
Magic3D的界面是基于MyGUI制作的,MyGUI的界面布局详细信息位于.layout文件中,.xml文件中是界面图标的详细信息。
1.添加按钮
添加按钮属于界面设计,应在.layout文件中添加相关信息,各个界面的.layout文件在Media文件夹下的子文件夹中。以点云界面布局(PointShopApp.layout)为例进行说明。添加按钮的方式有两种,一种是直接在相应的.layout文件中添加,另一种是通过 UI编辑器LayoutEditor添加。
1)直接在文件中添加
打开相应的.layout文件,在其中加入以下代码:
<Widget type="Button" skin="Button" position="15 405 60 60" align="Left Top" name="But_Clear"/>
type是加入的控件类型,Button是按钮控件类型,也有其他如ProgressBar进度条控件类型等;skin是对应控件上的皮肤,即图标名称,“Button”是MyGUI默认的按钮皮肤类型,也可定义自己的图标;position是添加控件的所在位置,前两个数字(15, 405)为控件在画布(界面)上的位置坐标,后两个数字(60, 60)为控件的大小;align为对齐方式,一般按钮的对齐方式均为Left Top;name为控件的名称。
注意:值得注意的是,在自定义图标时,skin,也就是图标名称,须在Magic.xml文件(皮肤信息文件)中声明,并和控件一一对应。
2)通过UI编辑器添加
上述界面为UI编辑器(LayoutEditor)的界面,通过file->load导入想要修改的界面,如下图所示。
上图就是导入PointShopApp.layout布局的界面,创建按钮大体需经过以下步骤:
- 在右侧Widgets选项卡中选择想要添加的控件类型;
- 然后在左侧的画布中选择位置画出控件即可;
- perties选项卡可以设置相关属性,如名称,位置、大小等。
这种方式添加按钮比较方便快捷,不必准确计算按钮的位置坐标,方法一则需要计算出控件的位置坐标。添加完控件之后,在相应的.layout文件中会自动生成相应的代码。
2.为按钮添加图标
1)直接在文件中添加
皮肤信息的文件在Media/MyGUIResource/MagicSkin.xml文件中,在文件中添加如下格式的信息:
<Resource type="ResourceSkin" name="But_Home" size="86 86" texture="MagicSkin.png"><BasisSkin type="SubSkin" offset="0 0 86 86" align="Stretch"><State name="disabled" offset="86 1 86 86"/><State name="normal" offset="86 88 86 86"/><State name="highlighted" offset="86 175 86 86"/><State name="pushed" offset="86 262 86 86"/></BasisSkin>
</Resource>
有以下注意点:
- 需要将所添加的图片放置在Magic.xml所在同一路径下,texture即为所要添加的图片;
- 或者将图片放在Magic.xml所在同一路径的文件夹(文件夹名字须为英文)中,在texture后表明图标所在位置,如"texture = “”./Image/MagicSkin.png";
- name为皮肤名称,在界面创建按钮时,自定义的图标会对应到这里。
按钮的皮肤属性,一般需要激活以上四个属性,分别为disable、normal、highlighted、pushed。在Magic3D中,是将所有图标集成在一张大图片上,通过索引每个小图标的在大图片上的位置坐标来添加图标。offset代表小图标在大图片上的偏移量,前两个元素是小图标的位置坐标,后两个数字是小图标的尺寸大小;normal,代表按钮在正常情况下显示的图标;highlighted,代表鼠标放置在该按钮上显示的图标;pushed,代表按钮被按下时显示的图标;disabled,尚未理解该属性的含义。以上四种属性对应的图标呈渐变趋势,以此呈现出一种按钮被按下、聚焦的动态变化。
但在我们的项目中,可以不需要激活以上全部属性,激活normal和highlighted属性即可,如下:
<Resource type="ResourceSkin" name="But_FeatureAlignment" size="86 86" texture="feature.png"><BasisSkin type="SubSkin" offset="0 0 86 86" align="Stretch"><State name="normal" offset="0 0 86 86"/><State name="highlighted" offset="0 1 86 86"/></BasisSkin>
</Resource>
因为我们添加的图标是单张图标,不是集成大图片,所以偏移量为0,highlighted可以偏移1-2个单位,鼠标聚焦在按钮位置时,可以呈现出动态变化。
2)使用皮肤编辑器添加
以上为皮肤编辑器(SkinEditor)的界面,需要做以下配置:File->Settings->Folders->Add,将图片所在路径添加进来,保存,退出,再次打开皮肤编辑器,导入Magic.xml文件,在右侧Texture栏即可找到自己要添加的图片。
点击Create即可创建,Rename给皮肤命名,Texture为图标;States栏即可激活上述的相应属性,在Position可指定偏移量;Separators和Regions可不用配置。
hots\屏幕截图(6).png" alt=“屏幕截图(6)” style=“zoom:80%;” />
3.按钮链接到功能函数
通过以上过程可以在界面中创建按钮和相应的图标,接下来就是将按钮和对应的功能函数链接起来。
在Magic3D中,类名称后缀带有UI的是界面类,界面的呈现会在这个类里实现,不带UI的类是功能的具体实现。如PointShopAppUI类是将点云处理的界面呈现出来,而PointShopApp类是点云处理功能的具体实现。ModelManager类是模型管理类,包括点云、网格的导入与获取,在各个类中,处理的点云网格都是基于这个类里的点云网格。
1.资源文件的加载
我们在上边已经在.layout和.xml文件中分别添加了按钮和图标,接下来我们需要将这些资源加载进来并呈现,这些都在PointShopAppUI.cpp中的Setup()函数中:
MagicCore::ResourceManager::LoadResource("../../Media/PointShopApp", "FileSystem", "PointShopApp");
mRoot = MyGUI::LayoutManager::getInstance().loadLayout("PointShopApp.layout");
通过以上代码将所需资源加载进来。接下来就要将按钮和功能函数链接起来:
mRoot.at(0)->findWidget("But_FeatureAlign")->castType<MyGUI::Button>()->eventMouseButtonClick += MyGUI::newDelegate(this, &PointShopAppUI::PointCloudFeatureAlignment);
其中,
findWidget(“But_FeatureAlign”),找到对应名称的Widget(小部件);
castType MyGUI::Button(),指定Widget为按钮类型,eventMouseButtonClick为鼠标按钮单击(鼠标按下和抬起)事件;
MyGUI::newDelegate(this, &PointShopAppUI::PointCloudFeatureAlignment),指定了链接到的对应的功能函数。PointCloudFeatureAlignment函数参数的定义有固定格式,这种格式取决于eventMouseButtonClick事件,可通过查看eventMouseButtonClick的定义来确定,这种事件对应的功能函数定义格式为
void PointShopAppUI::PointCloudFeatureAlignment(MyGUI::Widget* pSender)
2.功能函数的实现
然后在PointCloudFeatureAlignment函数中写出功能实现,如下:
void PointShopAppUI::PointCloudFeatureAlignment(MyGUI::Widget* pSender)
{PointShopApp* pointShop = dynamic_cast<PointShopApp*>(AppManager::Get()->GetApp("PointShopApp"));if (pointShop != NULL){pointShop->PointCloudFeatureAlignment(true);}
}
因为在Maic3D中,点云处理功能的具体实现是在PointShopApp.cpp中实现的,所以通过指针对象pointShop调用具体实现,分在PointShopApp.h和PointShopApp.cpp文件中定义功能函数的具体实现。
PointShopApp.cpp的具体实现如下:
void PointShopApp::PointCloudFeatureAlignment(bool isSubThread)
{if (!IsCommandAvaliable()){return;}if (isSubThread){mCommandType = ALIGNMENT;DoCommand(true);}else{/* 这里为功能函数的据题实现*/ModelManager::Get()->SetPointCloudInfo(NULL);ResetSelection();//可有可无,不影响最后效果的呈现mUpdatePointCloudRendering = true;//标志位为true就可实现渲染mpUI->SetPointCloudInfo(ModelManager::Get()->GetPointCloud()->GetPointCount());}}
这段函数可将具体实现加入子线程,是通过DoCommand(true)函数将实现推入子线程;mUpdatePointCloudRendering = true,此语句实现了点云的渲染,加在函数最后即可;mpUI->SetPointCloudInfo(ModelManager::Get()->GetPointCloud()->GetPointCount()),指明了点云具体个数。
BGL文档,常用点云网格函数[1]http://geometryhub.net/bgl/document
Magic3D(MyGUI)简单使用相关推荐
- mygui初探(二)皮肤编辑器
mygui初探(二)皮肤编辑器 作者:游蓝海(http://blog.csdn.net/you_lan_hai) mygui(官网http://mygui.info),是一个开源的游戏ui库,号称高速 ...
- 使用红孩儿工具箱完成基于Cocos2d-x的简单游戏动画界面
[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ3群:205100149,47 ...
- OSG+MyGUI结合下中文输入的若干问题
好久又没写文章了,经过这两天的研究,终于搞定了OSG+MYGUI的中文输入问题,现在进行一下所遇问题的汇总,方便自己以后查阅 问题1.小键盘数字的输入问题(这个是很久以前解决的) osg并不能给你真正 ...
- 网游UI解决方案的选择(CEGUI/MYGUI/Hikari/Scaleform/...)
网游UI解决方案的选择 作者 鸣·铭 转载请注明出自http://www.mobilegamebase.com 由于新项目动工,UI方面需要确定方向,所以最近纠结于各种解决方案的选择.以下是对各方案的 ...
- 在docker上安装部署tomcat项目 超简单,拿来主义
在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...
- Linux下tomcat的安装与卸载以及配置(超简单)
无敌简单的几步 1.安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置 2.卸载 rm - ...
- Docker安装Apache与运行简单的web服务——httpd helloworld
Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...
- Docker的安装、镜像源更换与简单应用
Docker的安装.镜像源更换与简单应用[阅读时间:约20分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.Docker的安装 四.Docker的简单应用 1. ...
- 基于Golang的简单web服务程序开发——CloudGo
基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...
最新文章
- java doc 编写
- HTC推出新款VR头显,奇怪的是只在日本销售
- Windows核心编程 第三章 内核对象
- Codeforces 486D. Valid Sets
- C++ Primer 5th笔记(chap 16 模板和泛型编程)成员模板
- js ejs for语句的第二种遍历用法
- 线程池选择使用的hash算法
- 赠票福利 | 2018人工智能计算大会报名开启:算力爆燃,AI进化
- 关于字符集和字符编码格式
- 程序设计语言的发展过程
- 音量放大器--软件实现
- 非线性光纤光学_《Nature》子刊:解决大纵横比光纤中传质不匀的难题!
- 程序员学习交流的网站论坛
- excel取消按颜色排序_在Excel中按颜色排序
- pandas shift函数的用法
- linux 如何清理垃圾文件,Linux系统怎样清理垃圾文件
- 163邮箱苹果设置不成功_iphone手机,苹果手机如何登陆网易163邮箱
- Zhishi.me - Weaving Chinese Linking Open Data
- 初级计算机基础知识教程,计算机基础知识(初中级教程)
- 解决视频切片转码后无法无法快进的问题