因为Font改动
所以对应的xmlHandler也有改变
/Files/oiramario/CEGUIFont_xmlHandler.rar
posted on 2006-05-23 09:13 千里马肝 阅读(757) 评论(28)  编辑 收藏

  回复  引用  查看    
2006-05-31 11:22 | 薛青斌 [未注册用户]
你知道哪儿有CEGUI的学习资源么? 我在网上找了好久也没找到
我的msn是makiven@hotmail.com
  回复  引用  查看    
2006-06-01 18:06 | 千里马肝      
还真的就此一家
别无二店
  回复  引用  查看    
2006-06-05 17:29 | 薛青斌 [未注册用户]
你的msn是什么?我加你。
  回复  引用  查看    
2006-06-06 00:26 | 千里马肝      
近期会有CEGUI相关的文章放出
敬请关注
  回复  引用  查看    
2006-06-06 14:16 | 薛青斌 [未注册用户]
请教大哥一个问题:
我想用CEGUI设计游戏的UI,游戏引擎是ogre + ode
ui部分我想用lua脚本写,但不知道如何设计,lua脚本要是放在客户端有很大的安全问题,放到服务端要在客户端显示的时间可能需要把lua脚本传到客户端,也不是很好,不知道有什么好的解决方法。

先谢过!!

  回复  引用  查看    
2006-06-09 12:03 | 大宝_天天见 [未注册用户]
马肝啊,近期是多久阿,都一个月了哦,关于cegui支持中文的资料
近来在用cegui做界面,能支持中文了,就是不知道怎么实现的。。。
  回复  引用  查看    
2006-06-10 10:43 | 千里马肝      
文章早就写完
也提交给《游戏创造》的编辑了
预计会是7月上吧
不过这一篇倒只是介绍CEGUI的主体架构
中文相关的计划在下一篇丢出来
计划的三篇CEGUI相关文章的标题:

在游戏中使用CEGUI —— 第一章(底层).doc
在游戏中使用CEGUI —— 第二章(改造).doc
在游戏中使用CEGUI —— 第三章(工具).doc
  回复  引用  查看    
2006-06-12 11:29 | 薛青斌 [未注册用户]
什么时间可以全部出来呢? 我也在用它做UI,等着用这些资料。

希望用CEGUI做界面的都留下msn,大家一块交流。
我的是makiven@hotmail.com
  回复  引用  查看    
2006-06-13 13:37 | 千里马肝      
文章还要慢慢写
写出来给大家共享总比一个个讲解得要来得好
要不大家都先学着用着
有什么使用上的问题尽管来问
只要我知道的~
  回复  引用  查看    
2006-06-21 10:37 | 薛青斌 [未注册用户]
我用你提供的这几个文件
CEGUIFont.cpp,CEGUIFont.h,CEGUIFont_xmlHandler.cpp,CEGUITexture.h覆盖掉原来的,编译,把动态库copy到demo运行目录,我在demo中添加了一个函数
int ASCII2UTF8(char *szAnsi, char *szUtf8)
{
wchar_t *szUnicode = NULL;
int iLengthUnicode = 0;
iLengthUnicode = MultiByteToWideChar(CP_ACP, 0, szAnsi, (int)strlen(szAnsi), NULL, 0);
szUnicode = new wchar_t[ iLengthUnicode ];
memset(szUnicode, 0, sizeof(wchar_t)*(iLengthUnicode));
MultiByteToWideChar(CP_ACP, 0, szAnsi, (int)strlen(szAnsi), szUnicode, iLengthUnicode);

char *szUtf8String = NULL;
int iLengthAnsiString = 0;
iLengthAnsiString = WideCharToMultiByte(CP_UTF8, 0, szUnicode, iLengthUnicode, NULL, 0, NULL, NULL);
szUtf8String = new char[ iLengthAnsiString];
memset(szUtf8String, 0, sizeof(char)*(iLengthAnsiString));
WideCharToMultiByte(CP_UTF8, 0, szUnicode, iLengthUnicode, szUtf8String, iLengthAnsiString, NULL, NULL);

if(szUtf8 )
{
memcpy(szUtf8, szUtf8String, (iLengthAnsiString));
}

if(szUnicode) {delete[] szUnicode; szUnicode = NULL;}
if(szUtf8String) {delete[] szUtf8String; szUtf8String = NULL;}
return iLengthAnsiString;
}
用它转成utf,但运行出来显示什么也没有.我的cegui版本是cegui_mk-0.4.0-deps-vc71-xerces.zip。

另外我看了官网提供的解决方案http://www.cegui.org.uk/phpBB2/viewtopic.php?t=1066,提示loadscheme时间的异常:defineFontGlyphs_impl - operation requires a texture larger than the supported maximum。 我准备了ttf字体文件
  回复  引用  查看    
2006-06-21 10:44 | 薛青斌 [未注册用户]
官网解决方案中问题可能在这块:
<GlyphRange StartCodepoint="19968" EndCodepoint="40868" />
这个应该是繁体字的内码范围,但不知道简体字范围是什么。
  回复  引用  查看    
2006-06-21 15:38 | 薛青斌 [未注册用户]
还有个editbox问题,我输入中文的时候程序会直接挂掉。不知道怎么解决
  回复  引用  查看    
2006-06-21 19:10 | 千里马肝      
我还是贴出来吧,不过前面已经说了很多次是在一个ceguiHelper里
u8 const *tl_ceguiHelper::
AnsiToUtf8(char const *szAnsi)
{
// ANSI => WCHAR
size_t lengthAnsi = strlen(szAnsi);
size_t lengthUnicode = MultiByteToWideChar(CP_ACP, 0, szAnsi, lengthAnsi, NULL, 0);
if (s_wchar_buf.size() < lengthUnicode + 1)
{
s_wchar_buf.resize(lengthUnicode * 2);
}
wchar_t *szUnicode = &s_wchar_buf[0];
MultiByteToWideChar(CP_ACP, 0, szAnsi, lengthAnsi, szUnicode, lengthUnicode);
szUnicode[lengthUnicode] = 0;

// WCHAR => UTF8
size_t lengthUtf8 = WideCharToMultiByte(CP_UTF8, 0, szUnicode, lengthUnicode, NULL, 0, NULL, NULL);
if (s_utf8_buf.size() < lengthUtf8 + 1)
{
s_utf8_buf.resize(lengthUtf8 * 2);
}
s8 *szUtf8String = &s_utf8_buf[0];
WideCharToMultiByte(CP_UTF8, 0, szUnicode, lengthUnicode, szUtf8String, lengthUtf8, NULL, NULL);
szUtf8String[lengthUtf8] = 0;

return (u8 *)szUtf8String;
}

static std::vector<wchar_t> s_wchar_buf; //!< wchar缓冲
static std::vector<s8>s_utf8_buf; //!< utf8缓冲

  回复  引用  查看    
2006-06-21 19:14 | 千里马肝      
另外,文件更新后,关键在于你的Renderer中的Texture类有没有对应实现:
virtual void updateFromMemory(int xOffset, int yOffset, int subWidth, int subHeight, void const *pData);

这样应该就够了
  回复  引用  查看    
2006-06-21 19:16 | 千里马肝      
所谓的官网提供的解决方案http://www.cegui.org.uk/phpBB2/viewtopic.php?t=1066

这只是一个static的解决办法
是假设你已知程序中会出现的所有汉字
但这也只限于少量的字
只适合于DEMO演示用
因为毕竟在之前的Font实现中只有一张纹理用于存放字

我在Font修改的即是按照需要会动态生成及更新纹理
维护的是一个纹理数组
  回复  引用  查看    
2006-06-21 19:22 | 千里马肝      
想到之前的测试方法供你参考
你试着运行某一个界面
其中有一个按钮控件
然后将该按钮的鼠标设置为Font中的Texture[0]取出的Image
这样,就可以查看文字是否正确得更新到纹理上了
  回复  引用  查看    
2006-06-22 13:53 | 薛青斌 [未注册用户]
我看了之前的说明,但缺少
#include "../Type.h"
#include "../Render.h"
两个文档,所以自己写了转换函数,因为其中的U8 U32 还有S8等类型都不确定。
我不知道怎么实现updateFromMemory这个函数,内存中的图片是从那儿取得的?updateFromMemory在什么地方被调用?
刚开始用CEGUI,还不懂它的内部机制,见谅。
  回复  引用  查看    
2006-06-23 17:17 | 千里马肝      
/*--------------------- type define ---------------------*/
typedef char s8;
typedef unsigned char u8;

typedef short s16;
typedef unsigned short u16;

typedef int s32;
typedef unsigned int u32;

typedef __int64 s64;
typedef unsigned __int64 u64;

typedef float f32;
typedef double f64;


typedef u8 Byte;
typedef u16 Word;
typedef unsigned long DWord;
typedef u32 Wparam;
typedef long Lparam;
  回复  引用  查看    
2006-06-23 17:20 | 千里马肝      
Font会自动在需要更新纹理时调用Texture的updateFromMemory方法
而具体实现
像OpenGL就是
glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, subWidth, subHeight, getGLOriginFormat(ePixelfmt), GL_UNSIGNED_BYTE, pData);

而D3D就是
Texture的Lock/UnLock操作
  回复  引用  查看    
2006-06-26 16:09 | 薛青斌 [未注册用户]
这是我根据LoadFromMemory写的updateFromMemory,测试没什么效果,
是不是名字也应该改成LoadFromMemory?是不是updateFromMemory这个函数我写的有问题:
void DirectX9Texture::updateFromMemory(int xOffset, int yOffset, int subWidth, int subHeight, void const *pData) const
{
using namespace std;

// release old texture
freeD3DTexture();

// calculate square size big enough for whole memory buffer
uint tex_size = ceguimax(subWidth, subHeight);

// create a texture
// TODO: Check resulting pixel format and react appropriately.
HRESULT hr = D3DXCreateTexture(((DirectX9Renderer*)getRenderer())->getDevice(), tex_size, tex_size, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &d_d3dtexture);

if (FAILED(hr))
{
throw RendererException((utf8*)"Failed to load texture from memory: D3D Texture creation failed.");
}
else
{
D3DSURFACE_DESC texdesc;
d_d3dtexture->GetLevelDesc(0, &texdesc);

// store new size;
d_width = (ushort)texdesc.Width;
d_height = (ushort)texdesc.Height;

// lock the D3D texture
D3DLOCKED_RECT rect;
hr = d_d3dtexture->LockRect(0, &rect, NULL, 0);

if (FAILED(hr))
{
d_d3dtexture->Release();
d_d3dtexture = NULL;

throw RendererException((utf8*)"Failed to load texture from memory: IDirect3DTexture9::LockRect failed.");
}
else
{
// copy data from buffer into texture
ulong* dst = (ulong*)rect.pBits;
ulong* src = (ulong*)buffPtr;

for (uint i = yOffset; i < subHeight; ++i)
{
for (uint j = xOffset; j < subWidth; ++j)
{
dst[j] = src[j];
}

dst += rect.Pitch / sizeof(ulong);
src += buffWidth;
}

d_d3dtexture->UnlockRect(0);
}

}
}
  回复  引用  查看    
2006-06-26 20:57 | 千里马肝      
为什么要create?
直接把现有的Texture拿着Lock,将传入的数据更新上去就好了
  回复  引用  查看    
2006-06-27 15:54 | 薛青斌 [未注册用户]
修改了,还没效果,@@
void DirectX9Texture::updateFromMemory(int xOffset, int yOffset, int subWidth, int subHeight, void const *pData)
{
using namespace std;

// calculate square size big enough for whole memory buffer
uint tex_size = ceguimax(subWidth, subHeight);


D3DSURFACE_DESC texdesc;
d_d3dtexture->GetLevelDesc(0, &texdesc);

// store new size;
d_width = (ushort)texdesc.Width;
d_height = (ushort)texdesc.Height;

// lock the D3D texture
D3DLOCKED_RECT rect;
HRESULT hr = d_d3dtexture->LockRect(0, &rect, NULL, 0);

if (FAILED(hr))
{
d_d3dtexture->Release();
d_d3dtexture = NULL;

throw RendererException((utf8*)"Failed to load texture from memory: IDirect3DTexture9::LockRect failed.");
}
else
{
// copy data from buffer into texture
ulong* dst = (ulong*)rect.pBits;
ulong* src = (ulong*)pData;

for (uint i = yOffset; i < subHeight; ++i)
{
for (uint j = xOffset; j < subWidth; ++j)
{
dst[j] = src[j];
}

dst += rect.Pitch / sizeof(ulong);
src += subWidth;
}

d_d3dtexture->UnlockRect(0);
}

//}
}
dx不懂,只能照葫芦画瓢。
  回复  引用  查看    
2006-07-02 21:12 | 千里马肝      
这个可能就要你自己多试试了
先写个小程序看看纹理局部更新是否正常
  回复  引用  查看    
2007-01-07 17:56 | Collins [未注册用户]
to 薛青斌:
OGRE和CEGUI配合的时候用的是OgreCEGUITexture,不是DirectX9Texture,你改错地方了。
  回复  引用  查看    
2007-01-08 00:29 | Collins [未注册用户]
在OgreCEGUITexture重载updateFromMemory,但是OgreCEGUITexture不认识DirectX,也不应该认识,所以要修改DirectX9Texture的基类Ogre::Texture,加接口,名字也叫updateFromMemory吧,然后DirectX9Texture重载并实现它,最后在OgreCEGUITexture::updateFromMemory里面调用dd_ogre_texture->updateFromMemory。写好了记得把代码贴出来。:-)
  回复  引用  查看    
2007-01-18 00:23 | 阿刚 [未注册用户]
马肝兄:

能不能将你写的CEGUI文章给我发一份,我现在一直在学习它,希望能得到你的帮助,能够快速掌握它。

我这里先谢谢你了!我的邮箱是hcg_me@126.com
  回复  引用  查看    
2007-01-18 10:43 | 千里马肝      
我早就放出来了:) 帮你把链接都找好了,请下载。
http://www.cnblogs.com/oiramario/archive/2006/10/11/525929.html

  回复  引用  查看    
2007-01-20 00:05 | 阿刚 [未注册用户]
非常感谢,你写的第一章我很早就看到了,写的很不错,有没有其它章节的?CEGUI5.0已经发布了,第2章也应该有了吧?

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
向地震灾区捐赠爱心
 
 
<2006年5月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

与我互动

常用链接

留言簿(32)

我参与的团队

我的标签

随笔档案(288)

文章档案(1)

好友

搜索

  •  

最新评论

阅读排行榜

评论排行榜