日志又扔了两天.主要原因是出去玩了,玩了24个小时,休息了24个小时,正好两天.
Sprites是一副遮挡的图或者几副遮挡的图,可以在背景上或者其他的Sprites上面移动的图.这个东东不用应用程序必须去redraw下面的窗口.简单的说就是一种可以移动的图片,几乎所有游戏都会用到的呃.你可以在用到的时候自己创建Sprites类.试用时间器或者自动的重画方法来使图片动起来.加之Symbian OS包含了一个现成的RWsSprite类,提供了一个时间器来控制图片在规定的时间内自动redraw和变化.
创建一个Sprites: 1.创建一个新的RwsSprite 2.根据需要创建多个TSpriteMembers,并把他们添加到Sprites里面. 3.激活Sprites.
每一个Sprites包含一个或多个TSpriteMembers,他们定义了Sprites包含的所有图片资源.每一个成员(TSpriteMembers)包括: 1.Sprites的成员图片(iBitmap) 2.Srpites的遮挡(iMaskBitmap),如果不使用则设置为空. 3.是否使用反相遮挡(iInvertMask),如果设置为Efalse则表示未使用反相遮挡,即黑色为透明. 4.iOffset设置便宜量,定义Srpites的中心. 5.iInterval设置成员的可见时间. 6.iDrawMode显示模式,只是在无遮挡的情况下才会使用.
下面代码演示了如何从一个MBM文件中载入图片,激活Srpites.
以下内容为程序代码: // .h
RWsSprite iMySprite;
TSpriteMember iMySpriteMembers[7];
// .cpp
void CMyGameAppView::ConstructL(const TRect& aRect)
{
CreateWindowL();
SetRect(aRect);
// The mbm contains:
// SpriteImage1.bmp
// * Every second image is a mask.
// SpriteImage1Mask.bmp
// . . .
_LIT(KMySpriteMBM, "MySprite.mbm"[img]/images/wink.gif[/img];
TFileName mbmFileName(KMySpriteMBM);
CompleteWithAppPath(mbmFileName);
// Construct my sprite
iMySprite = RWsSprite( CEikonEnv::Static()->WsSession() [img]/images/wink.gif[/img];
User::LeaveIfError( iMySprite.Construct( Window(),
TPoint(0,0), 0 [img]/images/wink.gif[/img] [img]/images/wink.gif[/img];
// Load bitmaps (image+mask) and set properties for each member;
// 7 members in total (7 images + 7 masks)
for ( TInt i = 0; i < 7; i ++ [img]/images/wink.gif[/img]
{
// Load image
iMySpriteMembers[i].iBitmap = new ( ELeave [img]/images/wink.gif[/img] CFbsBitmap();
User::LeaveIfError( iMySpriteMembers[i].iBitmap->Load(
mbmFileName, i * 2, EFalse [img]/images/wink.gif[/img] [img]/images/wink.gif[/img];
// Load mask for the image
iMySpriteMembers[i].iMaskBitmap = new ( ELeave [img]/images/wink.gif[/img] CFbsBitmap();
User::LeaveIfError( iMySpriteMembers[i].iMaskBitmap->Load(
mbmFileName, i * 2 + 1, EFalse [img]/images/wink.gif[/img] [img]/images/wink.gif[/img];
// Set properties for the member
iMySpriteMembers[i].iInvertMask = EFalse;
iMySpriteMembers[i].iOffset = TPoint(0,0);
// Change image every 1/10 seconds
iMySpriteMembers[i].iInterval =
TimeIntervalMicroSeconds32(100000);
// Append created member to sprite
User::LeaveIfError( iMySprite.AppendMember(
iMySpriteMembers[i] [img]/images/wink.gif[/img] [img]/images/wink.gif[/img];
}
// All members added. Activate the sprite; the sprite will be
// drawn/animated continuously to view until sprite is destroyed
// with iMySprite.Close()
User::LeaveIfError(iMySprite.Activate());
ActivateL();
}
| |
当一个Sprites建立以后,在他的存在期里,将自动重画和活动.我们只需要改变他在游戏中的存在的点就可以了.
以下内容为程序代码: void CMyGameAppView::MoveMySpriteTo(const TPoint& aPos)
{
iMySprite.SetPosition(aPos);
}
| |
有时候必须更改一些图片的内容,以为每一个成员的图片只是普通的CFbsBitmap,只是图片的控制信息被发送到窗口服务.在添加成员的时候,图片的控制权并不会改变.图片的内容可以在任意时间内改变,我们只需要修改成员的iBitmap和iMaskBitmap就可以了.修改了以后,你可以调用iMySprite.UpdateMember(index)立刻应用修改,否则可能会等一段时间才能看到修改的内容.
注意,这里不能使用以前的方法来改变图片的大小了.如果想改变或者完全替换原来的图片,你必须新建一个TSpriteMember,使用UpdateMember(TInt aIndex, const TSpriteMember& aMemberData). |