第一步:小地图纹理的制作
程序截取小地图通常是我们所说的拍顶视图,有关拍顶视图的过程这里不讨论。所以跳过这一步.
第二步:读取纹理到内存中
下面是相关的代码片段:
CEGUI::Imageset* pImgSet = NULL;
if (!CEGUI::ImagesetManager::getSingletonPtr()->isImagesetPresent("picSetName"))
{
pImgSet = CEGUI::ImagesetManager::getSingleton().createImagesetFromImageFile("picSetName", "picture.jpg");
}
else
{
pImgSet = CEGUI::ImagesetManager::getSingleton().getImageset("picSetName");
}
第三步:将玩家当前所在的位置对应到地图纹理的像素点上
假设我们地图的大小是MAP_WIDTH*MAP_HEIGTH, 玩家位置是playerPos.x, playerPos.z(vector3类型的)
那么他在地图纹理上的中对应的位置是playerPos.x/MAP_WIDTH*pImgSet->getWidth(), playerPos.z/MAP_HEIGTH*pImgSet->getHeight();
公式是: 玩家位置/地图大小*纹理的大小
说明: 玩家位置/地图大小就是玩家所在的地图位置中的比例, 再乘以纹理的大小就转到了纹理中的位置.
第四步:确定纹理范围
首先要得到小地图窗口的大小。这里假设是: CEGUI::Size wndSz;
那么小地图的纹理范围是: CEGUI::Rect picRt;
picRt.d_left = playerPos.x/MAP_WIDTH*pImgSet->getWidth()-wndSz.d_width/2;
picRt.d_top = playerPos.z/MAP_HEIGTH*pImgSet->getHeight()-wndSz.d_height/2;
picRt.d_right = playerPos.x/MAP_WIDTH*pImgSet->getWidth()+wndSz.d_width/2;
picRt.d_bottom = playerPos.z/MAP_HEIGTH*pImgSet->getHeight()+wndSz.d_height/2;
第五步:渲染小地图
假设小地图窗口是 Windows* pWin;
pimgeset->undefineImage("curSmallMap");
pimgeset->defineImage("curSmallMap", picRt, Point(0, 0));
string mapProPerty = "set:";
mapProPerty += "picSetName";
mapProPerty += " image:curSmallMap";
pWin->setProperty("Image", mapProPerty);
就这样 一个方形的小地图就完成了~_~
注意第四步和第五步要放在游戏的每帧渲染里面,因为要实时更新。
本人还未实现怎么把方形的转化成圆形的地图。好像cegui不支持纹理混合的操作,但是网上看到有人说实现过
转载一下网址 http://icoder.blog.163.com/blog/static/11264634020092304365644/
有高手知道的指点一下~_~
转载或修改请说明出处
链接:http://blog.csdn.net/howlet2/archive/2009/11/26/4876093.aspx
作者:howlet
E-Mial: howlet3@126.com