OGRE中使用overlay脚本。。
比较简单。。笔记下,这里使用了ogreCore的LoadingOverlay,暂时只用了这些内容 - -
- 获得Overlay*:Overlay* pOverlay = OverlayManager::getSingleton().getByName("Core/LoadOverlay");
- 显示Overlay*:pOverlay->show();
- 隐藏Overlay*:pOverlay->hide();
- 获得Overlay中名为"Core/LoadPanel/Bar/Progress"的元素:OverlayElement* pElement = OverlayManager::getSingleton().getOverlayElement("Core/LoadPanel/Bar/Progress");
- 更新元素某属性的值:pElement->setWidth(30); // 如宽度
注意有些属性OverlayElement都有,有些要强制转换为脚本中的类型才能设定。 - 更新元素显示:pElement->_update();
OGRE中使用粒子系统
由于环境出了问题,CEGUI无法正常 囧 于是我改封装粒子。。
找到一个不错的编辑器:http://www.game-cat.com/ogre/pe/ParticleEditor_Beta.zip
但是要注意这个编辑器生成的particle文件,各个ParticleSystem前面要加上particle_system,否则1.6的OGRE无法读取(1.4的OGRE支持)。
如:particle_system Examples/Smoke
将粒子脚本和粒子用到的纹理都放到resources.cfg指定过的目录下
使用语句:
-
ParticleSystem* particle= mSceneMgr->createParticleSystem("test", "Examples/smoke");
-
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(particle);
即可添加一个粒子系统。
这里createParticleSystem的第一个参数是粒子系统名(相当于map-key吧,以后可以通过该值从SceneManager的getParticleSystem方法读取已创建的粒子系统);
第二个参数则是粒子系统在.particle文件中定义的名字。OGRE会搜索所有资源目录中的.particle去找是否有该资源。
在OGRE中使用Terragen生成的高度图。。
首先在Terragen的Landscape窗口,生成一个地形(Generate Terrain),完成后单击Export,导出成Raw 16 bits Intel Byte-Order(好像8bit也可以,没有试过)。
之后将OGRE SDK的media目录下的terrain.cfg文件复制一份,改成你想要的名字,修改里面的以下参数:
- WorldTexture=terrain_texture.jpg
这是纹理的贴图图片
- DetailTexture=terrain_detail.jpg
纹理的精细文件
- DetailTile=3
精细等级
- Heightmap.image=terrain.png
高度图源文件,可以是灰度图image,也可以是raw。
- Heightmap.raw.size=513
这本来是放在注释里面的,如果使用raw,则将这个size设成你地形的size。
- Heightmap.raw.bpp=2
这也是注释的内容。。如果用raw,则根据bits数,如果你生成8bits的,则bpp=1,16bits则为2。
- PageSize=513
建议和raw的size一样 - -。
改好后保存,将你需要的纹理文件和raw文件都放入media\materials\textures文件夹下。下面在OGRE中加载:
创建Terrain场景管理器
-
mSceneMgr = mRoot->createSceneManager("TerrainSceneManager");
加载场景
-
std::string terrain_cfg("test.cfg");
-
mSceneMgr -> setWorldGeometry( terrain_cfg );
完成 - -。。。
CEGUI主键盘上的回车原来是Return。。Orz
英语果然差劲Orz。。。
早上找Key,只看到NumpadEnter,找不到Enter,无意间发现Apostrophe上的tip是:Enter on main keyboard……
大喜,始终测不出来。。。后来百度之。。原来是RETURN。。
而Apostrophe乃是撇号的意思 OrzOrzOrz 不过我测了下,仿佛是按下回车旁边那个键(")按下再弹起的瞬间。。
为啥米回车会是Return???GOOGLE之。。找到《细查回车和换行》一文,节选如下:
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
话说回车的英文名是carriage return,怪不得\r会回到行首 = = 原来它就是回车,中文名字太奥义了。
Wiki百科说:回車鍵第一次由1960年在Smith Corona公司的印表機出現。當時,此鍵一般被標「Return」。為了幫助不說英語的用戶學習打字,之後出版的打字機經常被標「↵」符號。
~~~~~~~~~~~~TAT 可我见过的所有键盘都标的是Enter~~~~~
CEGUI setText无法显示中文。。
项目设好了中文字体,加上中文输入,输入的字符显示出来是正常的,但是直接在程序里面setText中文却显示乱码……
查了一下是字符编码的关系……CEGUI是UTF-8格式的。。必须进行转换。。我的项目使用多字节,下面是转换函数:
-
CEGUI::String CharArrayToString(const char* pszText)
-
{
-
// ASCII -> Unicode
-
int nLen = strlen(pszText);
-
std::wstring unicode(nLen, 0);
-
unicode.resize(
-
MultiByteToWideChar(CP_ACP, 0, pszText, static_cast<int>(nLen),
-
const_cast<wchar_t*>(unicode.data()), unicode.size())
-
);
-
-
// Unicode -> UTF-8
-
char buff[128] = "";
-
WideCharToMultiByte(CP_UTF8, 0, unicode.data(), static_cast<int>(unicode.size()),
-
buff, sizeof(buff), NULL, NULL);
-
-
return CEGUI::String((CEGUI::utf8*)(buff));
-
}
附上几个链接:
- 关于CEGUI的中文输入与显示:http://blog.csdn.net/naugthyLeo/archive/2009/05/25/4215687.aspx
这好像是我的老师 - -!我的项目就是按照该方法实现的中文输入。
- CEGUI中的汉字显示实现:http://blog.sina.com.cn/s/blog_613d5bdc0100er4f.html
由于CEGUI根据Unicode编码生成纹理,中文字符可能需要生成过多纹理,这里作者对CEGUI做了一些修改。
- 研究cegui,写脚本:http://songxiaoyu8.blog.163.com/blog/static/2081812820096232432677/
本文的末尾有一组编码转换的函数,方便使用^^ 上面的函数就是根据这里的修改。
Hello, CEGUI!
花了一天时间 终于搞懂一些些~贴图纪念:
支持中文输入,然后做了几个选择 = = Talk对象不同的话 聊天记录和名字\头像都会改变(废话 = ◇ =||),下面可以输入自己的名字 XD那个格子是表情。
有空可以做个网络版 就可以聊天啦 > <