symbian通过缓冲区游戏绘图

本文介绍了在Symbian平台上进行游戏开发时如何使用缓冲区进行绘图,包括创建背景图、贴图到背景以及将背景显示到屏幕上的过程,涉及到的关键操作如BitBlt和自定义的贴图函数MyBitMask。

塞班这货还是挺烂的。刚做了个游戏,需要旋转贴图、透明色贴图、与其依靠塞班,不如自己重写一遍。以下举个绘图的例子。

symbian绘图函数:

1.建立一张背景图

 CFbsBitmap *iBack_BufferBitmap;


void CTSFishGameContainer::ConstructL(const TRect& aRect)

{

    TDisplayMode displayMode =
            CEikonEnv::Static()->ScreenDevice()->DisplayMode();
    iBack_BufferBitmap = new (ELeave) CFbsBitmap();
    User::LeaveIfError(iBack_BufferBitmap->Create(Rect().Size(), displayMode));


}


2.在背景图片上贴图


void CTSFishGameContainer::MyBitMask(CFbsBitmap* aDstBuf, TPoint aDstPoint,
        CFbsBitmap* aSrcBuf, TRect aSrcRec, TUint32 aTransparentColor,
        TInt aDirectFlag)
    {

    if (!aDstBuf || !aSrcBuf)
        {
        return;
        }

    // Determine range, use the small ones
    // Means only need to copy the intersection       
    TRect drawSrcRect(aSrcRec);
    const TRect drawDstRect(TPoint(0, 0), aDstBuf->SizeInPixels());

    if (drawSrcRect.iTl.iX < 0)
        {
        drawSrcRect.iTl.iX = 0;
        }

    if (drawSrcRect.iBr.iX > aSrcBuf->SizeInPixels().iWidth)
        {
        drawSrcRect.iBr.iX > aSrcBuf->SizeInPixels().iWidth;
        }

    if (drawSrcRect.iTl.iY < 0)
        {
        drawSrcRect.iTl.iY = 0;
        }

    if (drawSrcRect.iBr.iY > aSrcBuf->SizeInPixels().iHeight)
        {
        drawSrcRect.iBr.iX > aSrcBuf->SizeInPixels().iHeight;
        }

    if (drawSrcRect.Width() <= 0 || drawSrcRect.Height() <= 0)
        {
        return;
        }

    TBitmapUtil bitmap1Util(aSrcBuf);
    TBitmapUtil bitmap4Util(aDstBuf);
    TUint32 transcolor = aTransparentColor;//CONVERT_BGR24_TO_BGR565(aTransparentColor);

    // Determine start address
    bitmap1Util.Begin(TPoint(0, 0));
    bitmap4Util.Begin(TPoint(0, 0));

    // Copy non-transparent pixels
    TUint32 pixel = 0;
    TPoint drawPos(0, 0);

    for (TInt y = 0; y < drawSrcRect.Height(); y++)
        {
        for (TInt x = 0; x < drawSrcRect.Width(); x++)
            {

            if (!aDirectFlag)
                {
                bitmap1Util.SetPos(TPoint(x, y));
                }
            else
                {
                bitmap1Util.SetPos(TPoint(drawSrcRect.iBr.iX - x - 1, y));
                }

            drawPos = TPoint(aDstPoint.iX + x, aDstPoint.iY + y);

            if (drawPos.iX >= 0 && drawPos.iX <= drawDstRect.iBr.iX
                    && drawPos.iY >= 0 && drawPos.iY <= drawDstRect.iBr.iY)
                {
                pixel = (bitmap1Util.GetPixel() & 0x00FFFFFF);
                if (pixel != transcolor)
                    {
                    bitmap4Util.SetPos(drawPos);
                    bitmap4Util.SetPixel(pixel);
                    }
                }
            }
        }

    // each Begin() must have a corresponding End()
    bitmap1Util.End();
    bitmap4Util.End();
    }



3.将绘制好的背景贴到屏幕真实屏幕上

void CTSFishGameContainer::Draw(const TRect& aRect) const
    {
    CWindowGc& gc = SystemGc();

    gc.Clear(aRect);
    if (iBack_BufferBitmap)
        {
        gc.BitBlt(Rect().iTl, iBack_BufferBitmap);
        }

}



4.绘制背景

void CTSFishGameContainer::UpdateGame()
    {
   //正向贴图
    MyBitMask(iBack_BufferBitmap, TPoint(100, 100), res_pic[GIF_HERO_TWO]->iFocusMap, TRect(
            TPoint(0, 0), res_pic[GIF_HERO_TWO]->iFocusMap->SizeInPixels()), KRgbWhite.Value(), 0);

    //反向贴图
    MyBitMask(iBack_BufferBitmap, TPoint(100, 200), res_pic[GIF_HERO_TWO]->iFocusMap, TRect(
            TPoint(0, 0), res_pic[GIF_HERO_TWO]->iFocusMap->SizeInPixels()), KRgbWhite.Value(), 1);

    
    if (IsVisible())
        {
        DrawDeferred();
        }

    return;

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值