游戏开发论坛

 找回密码
 立即注册
搜索
楼主: howlet2

cegui圆形地图

[复制链接]

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
发表于 2010-2-7 21:12:00 | 显示全部楼层

Re:cegui圆形地图

我没有用CEGUI做过,我用的是
http://www.dingge.com/forum/dispbbs.asp?boardid=46&Id=14179
这个实现的

17

主题

737

帖子

743

积分

高级会员

Rank: 4

积分
743
发表于 2010-2-8 22:37:00 | 显示全部楼层

Re:cegui圆形地图

你们用的什么版本的CEGUI?
0.7以上的话不用这么麻烦,拷贝来拷贝去的,直接往CEGUI的GeometryBuffer里填三角形就可以了

13

主题

79

帖子

81

积分

注册会员

Rank: 2

积分
81
QQ
 楼主| 发表于 2010-2-20 13:14:00 | 显示全部楼层

Re:cegui圆形地图

用Ogre::HardwarePixelBuffer::blit实现了,效率不好,本来游戏有30多帧的。lock一张900*900的纹理后就变成2-3帧了

13

主题

79

帖子

81

积分

注册会员

Rank: 2

积分
81
QQ
 楼主| 发表于 2010-2-20 13:14:00 | 显示全部楼层

Re: Re:cegui圆形地图

lcy03406: Re:cegui圆形地图

你们用的什么版本的CEGUI?
0.7以上的话不用这么麻烦,拷贝来拷贝去的,直接往CEGUI的GeometryBuffer里填三角形就可以了

还没用到0.7以上的版本。看来要研究一下用新版cegui实现

6

主题

40

帖子

67

积分

注册会员

Rank: 2

积分
67
发表于 2010-2-21 09:15:00 | 显示全部楼层

Re:cegui圆形地图

正好也在找这个东西的做法,按照你的说法也做了一下,效率很低,没法用,做地图的放大,缩小效果也很差。代码贴给你好了。
void cSamllMapPanel:oad(const char *fileName)
{
        WindowManager& winMgr = WindowManager::getSingleton();

        //放大
        Window* wndButton =
                winMgr.getWindow( "samllMap/BigIt" );
        wndButton->subscribeEvent(
                FrameWindow::EventMouseClick,
                Event::Subscriber(&cSamllMapPanel::handleMaxButton, this));
        //缩小
        wndButton =
                winMgr.getWindow("samllMap/smallIt");
        wndButton->subscribeEvent(
                FrameWindow::EventMouseClick,
                Event::Subscriber(&cSamllMapPanel::handleMinButton, this));
        //大地图
        wndButton =
                winMgr.getWindow("samllMap/BigMap");
        wndButton->subscribeEvent(
                FrameWindow::EventMouseClick,
                Event::Subscriber(&cSamllMapPanel::handleBigMapButton, this));
        //left
        wndButton =
                winMgr.getWindow("samllMap/Left");
        wndButton->subscribeEvent(
                FrameWindow::EventMouseClick,
                Event::Subscriber(&cSamllMapPanel::handleLeftButton, this));
        //right
        wndButton =
                winMgr.getWindow("samllMap/Right");
        wndButton->subscribeEvent(
                FrameWindow::EventMouseClick,
                Event::Subscriber(&cSamllMapPanel::handleRightButton, this));


        Window*  pWin= m_pkWindow->getChildRecursive("samllMap/mapFrame");

        //创建带遮罩的图像
        CEGUI::Texture& tex = System::getSingletonPtr()->getRenderer()->createTexture();
        tex.loadFromFile("smallMapMask.tga", "imagesets");
        CEGUI::Imageset& imSet = CEGUI::ImagesetManager::getSingleton().create("smallMap1Mask",tex);
        if ( !imSet.isImageDefined("full_image") )
        {
                CEGUI::Size sz = imSet.getTexture()->getSize();
                imSet.defineImage("full_image",CEGUI:oint(0,0),sz,CEGUI::Point(0,0) );
        }
        pWin->setProperty("Image","set:smallMap1Mask image:full_image");



        {
                //读取真正的地图纹理
                CEGUI::Texture& tex =  System::getSingletonPtr()->getRenderer()->createTexture();
                tex.loadFromFile("smallMap.tga", "imagesets");
                CEGUI::Imageset& imSet = CEGUI::ImagesetManager::getSingleton().create("smallMap1",tex);
                if ( !imSet.isImageDefined("full_image") )
                {
                        CEGUI::Size sz = imSet.getTexture()->getSize();
                        imSet.defineImage("full_image",CEGUI::Point(0,0),sz,CEGUI::Point(0,0) );
                }


        }

        //填充地图到带遮罩的纹理文件中去
        colorMap ccm;
        ccm = Getd3dTex("smallMap1","full_image");
        FillImageSetWithColorMap(ccm,(CEGUI:irect3D9Texture *)imSet.getTexture());
}


void cSamllMapPanel::FillImageSetWithColorMap(colorMap &c,CEGUI::Direct3D9Texture* tex,float fScale)
{
        LPDIRECT3DTEXTURE9 d3dT = tex->getDirect3D9Texture();
        D3DLOCKED_RECT rect;
        CEGUI::Size sz = tex->getSize();
        HRESULT hr = d3dT->LockRect(0,&rect,0,D3DLOCK_DISCARD);
        uint32* dst = static_cast<uint32*>(rect.pBits);

        int yDraw=0;
        yDraw = min(sz.d_height,c.size());

        for (uint i = 0; i < yDraw; ++i)
        {

                //根据插值大小得到列,放大一张图片是图片变粗糙,则有些列的像素相同
                //所有一张图片则需要从更大的空间获取像素
                fScale = 1.0/fScale;
                int col = (int)(fScale * i);
                if(col>c.size())
                {
                        col = c.size() - 1;
                }
                lineColor lc = c.at(col);
                int xDraw = min(sz.d_width,lc.size());

                for (uint j = 0; j < xDraw; ++j)
                {
                        int row = (int)(fScale*j);
                        if (row>lc.size())
                        {
                                row = lc.size() - 1;
                        }
                       
                        unsigned int color = lc.at(row);

                        uchar r = static_cast<uchar>(color & 0xFF);
                        uchar g = static_cast<uchar>((color >> 8) & 0xFF);
                        uchar b = static_cast<uchar>((color >> 16)  & 0xFF);
                        uchar a = static_cast<uchar>((color >> 24) & 0xFF);

                        uchar selfA = static_cast<uchar>(( dst[j]>>24) & 0xFF);
                        dst[j] = D3DCOLOR_ARGB(selfA, b, g, r);
                }

                dst += rect.Pitch / sizeof(ulong);
        }
        d3dT->UnlockRect(0);
}
可以看我的blog里更加详细的,放大,缩小,平移等等。http://songxiaoyu8.blog.163.com/blog/static/20818128201012191258533

13

主题

79

帖子

81

积分

注册会员

Rank: 2

积分
81
QQ
 楼主| 发表于 2010-2-21 10:28:00 | 显示全部楼层

Re:cegui圆形地图

谢谢楼上的回复,你的博客好像设置了访问权限。我是用ogre的接口操作的下面是部分关键代码:
        pPBMask->lock(HardwareBuffer::HBL_DISCARD);
        pPBSmallmap->lock(HardwareBuffer::HBL_DISCARD);
        const PixelBox &pbMask = pPBMask->getCurrentLock();
        const PixelBox &pbSmallmap = pPBSmallmap->getCurrentLock();

        /// Update the contents of pb here
        /// Image data starts at pb.data and has format pb.
        /// Here we assume data.format is PF_X8R8G8B8 so we can address pixels as uint32.
        unsigned int*dataMask = static_cast<unsigned int*>(pbMask.data);
        unsigned int*dataSmallmap = static_cast<unsigned int*>(pbSmallmap.data);
        size_t height = pbMask.getHeight();
        size_t width =  pbSmallmap.getWidth();
        size_t pitchMask = pbMask.rowPitch; // Skip between rows of image
        size_t pitchSmallmap = pbSmallmap.rowPitch;
        for(size_t y=0; y<height; ++y)
        {
                //结果是smallmap的color和mask的alpha结合
                for(size_t x=0; x<width; ++x)
                {
                        int alpha = (dataMask[pitchMask*y+x])&0xff000000;
                        int color = (dataSmallmap[pitchSmallmap*y+x])&0x00ffffff;
                        dataMask[pitchMask*y+x] = color|alpha;
                }
        }
        //Unlock the buffer again (frees it for use by the GPU)
        pPBMask->unlock();
        pPBSmallmap->unlock();
我lock了1024*900的图片就掉帧厉害了,我试过lock256*256的图片几乎不掉帧的。还没找的好的方法
我正在考虑用新版cegui的CEGUI::GeometryBuffer*实现混合的功能。有个appendVertex函数不知道怎么用。现在还不知道行不行 呵呵

13

主题

79

帖子

81

积分

注册会员

Rank: 2

积分
81
QQ
 楼主| 发表于 2010-2-21 10:44:00 | 显示全部楼层

Re:cegui圆形地图

我以前做过地图的放大缩小 直接用CEGUI的defineImage改变图片矩形区间的大小就好了,这样可能效果不好。后来就取消这个功能了

6

主题

40

帖子

67

积分

注册会员

Rank: 2

积分
67
发表于 2010-2-21 15:04:00 | 显示全部楼层

Re:cegui圆形地图

害我又花了一早上时间研究了cegui中的几何体。继承effect可以做到修改顶点,绘制出一个圆形。文章如下:
http://songxiaoyu8.blog.163.com/blog/static/2081812820101213227197

13

主题

79

帖子

81

积分

注册会员

Rank: 2

积分
81
QQ
 楼主| 发表于 2010-2-21 16:35:00 | 显示全部楼层

Re: Re:cegui圆形地图

songxiaoyu8: Re:cegui圆形地图

害我又花了一早上时间研究了cegui中的几何体。继承effect可以做到修改顶点,绘制出一个圆形。文章如下:
h...

谢谢你的回复,今天我把公司的项目从.net2003上转到了.net2005上(主要是新版cegui不支持.net2003了)。没在研究这个问题 谢谢你提供的代码。等把新版的cegui更新上去了 再研究一下你提供的代码 呵呵

13

主题

79

帖子

81

积分

注册会员

Rank: 2

积分
81
QQ
 楼主| 发表于 2010-2-21 16:36:00 | 显示全部楼层

Re: Re:cegui圆形地图

songxiaoyu8: Re:cegui圆形地图

害我又花了一早上时间研究了cegui中的几何体。继承effect可以做到修改顶点,绘制出一个圆形。文章如下:
h...

看了你的博客,一看就是高手啊 能加个qq好友不 [em1]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-6 12:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表