首 页 | 新 闻 | Symbian | Windows Mobile| J2ME | 下载中心 | 游戏策划 | 购书指南 | 移动开发视频教程
您现在的位置: 开发视界 >> 专家专栏 >> 剑走偏锋 >> 文章正文
Graphics(5)
作者:剑走偏锋    文章来源:本站原创    更新时间:2005-8-9 15:25:26
    日志又扔了两天.主要原因是出去玩了,玩了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).
相关文章:
控制与复合控制
Graphics(2)
Graphics(3)
Graphics(4)