塞班这货还是挺烂的。刚做了个游戏,需要旋转贴图、透明色贴图、与其依靠塞班,不如自己重写一遍。以下举个绘图的例子。
symbian绘图函数:
1.建立一张背景图
CFbsBitmap *iBack_BufferBitmap;
{
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;
}