⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rstatus.cpp

📁 symbian 的一个 二维飞行游戏 源码 及相关技术文章
💻 CPP
字号:
// Copyright 2002 Kenneth Guy,
// 
// RStatus.cpp

/** \file RStatus.cpp

    implementation of class RStatus */

#include <e32std.h>
#include <e32svr.h>

#include "RStatus.h"

/** constructor */
RStatus::RStatus() :  iStatusData(NULL) {

}

/** Open a status panel.

    This opens the RScreenUtils and remebers the status data. This
    does not plot the status pane on the screen.

    \param Status data see class RStatus for a description

    \return error code from RScreenUtils::Open()
*/
TInt RStatus::Open(const TUint16 *aStatusData) {
  TInt error=iScreen.Open();
  if(error==KErrNone) {    
    iSavedScore=-1;
    iSavedLives=-1;
    iSavedHealth=-1;
    iStatusData=aStatusData;
    }  
  return(error);
}

/** Close the status panel */
void RStatus::Close() {
  iScreen.Close();
  iStatusData=NULL;
}

/** Redraw the whole status pane. 

    Just resets the saved data to -1 and calls Update().

 \param aScore current score
 \param aLives current lives
 \param aHealth current health
*/

void RStatus::Draw(TInt aScore, TInt aLives, TInt aHealth) {
  iSavedScore=-1;
  iSavedLives=-1;
  iSavedHealth=-1;
  Update(aScore,aLives,aHealth);
}

/** Update status pane.

Just update the bits that have changed by erasing or plotting more
status sprites and erasing and replotting the score if it has changed.

 \param aScore current score
 \param aLives current lives
 \param aHealth current health

*/
void RStatus::Update(TInt aScore, TInt aLives, TInt aHealth) {
  if(iStatusData==NULL)
    return;
  TInt offset=0;
  if(iSavedScore==-1) {
    while(iStatusData[offset++]!=0xffff) {
      RScreenUtils::TPicture pics;
      pics.iData =  iStatusData+(iStatusData[offset++]/2);
      pics.iXSize=iStatusData[offset++];
      pics.iYSize=iStatusData[offset++];
      pics.iXPos=iStatusData[offset++];
      pics.iYPos=iStatusData[offset++];
      iScreen.DrawPicture(pics);
    }
  } else {
    while(iStatusData[offset++]!=0xffff) {};
  }

  UpdateSingle(offset,iSavedHealth,aHealth);
  // don't display the life the player is using
  UpdateSingle(offset,iSavedLives,aLives-1);

  if(iSavedScore!=aScore) {
    TUint16 x;
    TUint16 y;
    x=iStatusData[offset++];
    y=iStatusData[offset++];
    TUint16 foreColor=iStatusData[offset++];
    TUint16 backColor=iStatusData[offset++];
    iScreen.Number(x,y,aScore,foreColor,backColor);
    iSavedScore=aScore;
  }
}

/** Update a sprite status section.

    This updates either the health or the lives depending on the 
    position in the status data. The update is done by either plotting
    more sprites or erasing old ones.

    \param aOffset offset to status data for this sprite set, updated
           to be the TInt16 after this status data.
    \param aSaved old value for this status value.
    \param aNew new value for this status value.

*/
void RStatus::UpdateSingle(TInt &aOffset,TInt &aSaved, TInt aNew) {
  RScreenUtils::TPicture picture;
  RScreenUtils::TBlank blank;
  picture.iData = iStatusData+(iStatusData[aOffset++]/2);
  picture.iXSize=iStatusData[aOffset++];
  blank.iXSize=picture.iXSize;
  picture.iYSize=iStatusData[aOffset++];
  blank.iYSize=picture.iYSize;
  blank.iColor=iStatusData[aOffset++];
  picture.iXPos=iStatusData[aOffset++];
  blank.iXPos=picture.iXPos;
  TInt pos=0;
  while(picture.iXPos!=0xffff) {
    picture.iYPos=iStatusData[aOffset++];
    blank.iYPos=picture.iYPos;
    pos++;
    
    if(pos<=aNew && pos > aSaved)
      iScreen.DrawPicture(picture);
    
    if(pos > aNew && pos <= aSaved)
      iScreen.BlankArea(blank);
    
    picture.iXPos=iStatusData[aOffset++];
    blank.iXPos=picture.iXPos;
  }
  aSaved=aNew;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -