www.pudn.com > 2DGameAnimS60C_v1_0.zip > ShipAnim.cpp
//////////////////////////////////////////////////////////////////////// // // ShipAnim.cpp // // Copyright (c) 2003 Nokia Mobile Phones Ltd. All rights reserved. // //////////////////////////////////////////////////////////////////////// #include#include "RenderableFactory.h" #include "BitmapAnimFrame.h" #include "ShipAnim.h" //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// CShipAnim::CShipAnim() : CBaseAnim(TSize(32,32)) { } //////////////////////////////////////////////////////////////////////// CShipAnim* CShipAnim::NewL(CFbsBitmap& aSourceImage) { CShipAnim* self = new(ELeave) CShipAnim(); CleanupStack::PushL(self); self->ConstructL(aSourceImage); CleanupStack::Pop(); return self; } //////////////////////////////////////////////////////////////////////// CShipAnim::~CShipAnim() { } //////////////////////////////////////////////////////////////////////// void CShipAnim::ConstructL(CFbsBitmap& aSourceImage) { AllocRenderablesL(64); // Create image, device and context (only needed briefly): CFbsBitmap* image = new (ELeave) CFbsBitmap(); CleanupStack::PushL(image); User::LeaveIfError( image->Create(iSize, EColor4K ) ); CFbsBitmapDevice* device = CFbsBitmapDevice::NewL(image); CleanupStack::PushL(device); CFbsBitGc* gc; User::LeaveIfError(device->CreateContext(gc)); gc->SetBrushColor(TRgb(0,0,0)); // Create ship frames: TInt frame; for (frame = 0 ; frame <= 32 ; frame++) { gc->Clear(); BuildFrame(aSourceImage,frame,gc); AddRenderable(CBitmapAnimFrame::NewL(*image)); } for (; frame < 64 ; frame++) { gc->Clear(); BuildFlippedFrame(aSourceImage,64 - frame,*image); AddRenderable(CBitmapAnimFrame::NewL(*image)); } // Destroy context, device and image; delete gc; CleanupStack::PopAndDestroy(2); } //////////////////////////////////////////////////////////////////////// void CShipAnim::BuildFrame(CFbsBitmap& aSourceImage,TInt frame_no,CFbsBitGc* aGc) { // Convert frame to x-coord: TInt frame_x = frame_no << 5; aGc->BitBlt(TPoint(0,0),&aSourceImage,TRect(TPoint(frame_x,0),TSize(32,32))); } //////////////////////////////////////////////////////////////////////// void CShipAnim::BuildFlippedFrame(CFbsBitmap& aSourceImage,TInt frame_no,CFbsBitmap& aDestImage) { // Convert frame to x-coord: TInt frame_x = frame_no << 5; // Now use TBitmapUtils to flip source image // about the line x = y: TBitmapUtil srcUtil(&aSourceImage); TBitmapUtil destUtil(&aDestImage); srcUtil.Begin(TPoint(frame_x,0)); destUtil.Begin(TPoint(0,0),srcUtil); for (TInt y = 0 ; y < 32 ; y++) { srcUtil.SetPos(TPoint(frame_x,y)); destUtil.SetPos(TPoint(y,0)); for (TInt x = 0 ; x < 32 ; x++) { destUtil.SetPixel(srcUtil); srcUtil.IncXPos(); destUtil.IncYPos(); } } srcUtil.End(); destUtil.End(); } //////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////