📄 hfloorcontainer.cpp
字号:
/*
* ============================================================================
* Name : CHFloorContainer from HFloorContainer.h
* Part of : HFloor
* Created : 2003-7-5 by 土匪般的脸
* Implementation notes:
* Initial content was generated by Series 60 AppWizard.
* Version :
* Copyright:
* ============================================================================
*/
// INCLUDE FILES
#include <coemain.h>
#include "HFloorContainer.h"
#include "images.h"
#include "bitmapmethods.h"
#include <charconv.h>
#include <e32math.h>
#include <e32std.h>
#include <aknutils.h>
#include <f32file.h>
#include <eikappui.h>
#include <eikapp.h>
#define INTERALTIME 70000
#define DELAYTIME 70000
#define MENUSELECTSTART _L("START GAME")
#define MENUSELECTHELP _L("HELP")
#define MENUSELECTABOUT _L("ABOUT")
#define MENUSELECTQUIT _L("QUIT")
#define HPMAX 6
#define DEMOFLOORCNT 5
_LIT(KMbm, "bitmapdat.mbm");
_LIT(KSave, "save.dat");
_LIT(KHitWav, "hit.wav");
_LIT(KFallWav, "fall.wav");
_LIT(KBHitWav, "bhit.wav");
/*
_LIT(KMbm, "c:\\system\\apps\\HFloor\\bitmapdat.mbm");
_LIT(KSave, "c:\\system\\apps\\HFloor\\save.dat");
_LIT(KHitWav, "c:\\system\\apps\\HFloor\\hit.wav");
_LIT(KFallWav, "c:\\system\\apps\\HFloor\\fall.wav");
_LIT(KBHitWav, "c:\\system\\apps\\HFloor\\bhit.wav");
*/
// ================= MEMBER FUNCTIONS =======================
// ---------------------------------------------------------
// CHFloorContainer::ConstructL(const TRect& aRect)
// EPOC two phased constructor
// ---------------------------------------------------------
//
void CHFloorContainer::ConstructL(const TRect& aRect)
{
CreateWindowL();
SetRect(aRect);
// Get the application name with full path
TFileName app = CEikonEnv::Static()->EikAppUi()->Application()->AppFullName();
// Replace extension with mbm
TParse parse;
#ifdef __WINS__
parse.Set(_L("c:"), &app, NULL);
#else
parse.Set(app, NULL, NULL);
#endif
iMbmFileName.Copy(parse.DriveAndPath());
iMbmFileName.Append(KMbm);
iSaveFileName.Copy(parse.DriveAndPath());
iSaveFileName.Append(KSave);
iHitWavFileName.Copy(parse.DriveAndPath());
iHitWavFileName.Append(KHitWav);
iBHitWavFileName.Copy(parse.DriveAndPath());
iBHitWavFileName.Append(KBHitWav);
iFallWavFileName.Copy(parse.DriveAndPath());
iFallWavFileName.Append(KFallWav);
iMAPBHit = CMdaAudioPlayerUtility::NewFilePlayerL(iBHitWavFileName, *this);
iMAPHit = CMdaAudioPlayerUtility::NewFilePlayerL(iHitWavFileName, *this);
iMAPFall = CMdaAudioPlayerUtility::NewFilePlayerL(iFallWavFileName, *this);
//创建图片
imgBackgroud = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesMap1);
imgWall = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesWall);
imgBoarder = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesBoarder);
imgFloor = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor1);
imgFloor5 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor5);
imgPlayer[0] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay1);
imgPlayerMask[0] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay1mask);
imgPlayer[1] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay2);
imgPlayerMask[1] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay2mask);
imgPlayer[2] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay3);
imgPlayerMask[2] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay3mask);
imgPlayer[3] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay4);
imgPlayerMask[3] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay4mask);
imgPlayer[4] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay5);
imgPlayerMask[4] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay5mask);
imgPlayer[5] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay6);
imgPlayerMask[5] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay6mask);
imgPlayer[6] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay7);
imgPlayerMask[6] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay7mask);
imgPlayer[7] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay8);
imgPlayerMask[7] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay8mask);
imgPlayer[8] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay9);
imgPlayerMask[8] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay9mask);
imgPlayer[9] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay10);
imgPlayerMask[9] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay10mask);
imgPlayer[10] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay11);
imgPlayerMask[10] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay11mask);
imgPlayer[11] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay12);
imgPlayerMask[11] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay12mask);
imgPlayer[12] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay13);
imgPlayerMask[12] = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesPlay13mask);
imgTop = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesTop);
imgTopMask = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesTopmask);
imgLogo = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesLogoimg);
imgFloor2 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor2);
imgHeart = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesHeart);
imgFloor3 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor3);
imgFloor4 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor4);
imgFloor6 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor6);
imgFloor7 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor7);
imgFloor8 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor8);
imgFloor9 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor9);
imgFloor10 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor10);
imgFloor11 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor11);
imgFloor12 = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesFloor12);
imgTitle = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesTitle);
imgTitleMask = NBitmapMethods::CreateBitmapL(iMbmFileName, EMbmImagesTitlemask);
//创建定时器
iPeriodicTimer = CPeriodic::NewL(CActive::EPriorityStandard);
//初始化双缓冲环境
// Create the off screen bitmap and device / gc
iOffScreenBitmap = NBitmapMethods::CreateBitmapL(Rect().Size(),KColourDepth);
iOffScreenBitmapDevice = NBitmapMethods::CreateBitmapDeviceL(*iOffScreenBitmap);
iOffScreenBitmapGc = NBitmapMethods::CreateGraphicsContextL(*iOffScreenBitmapDevice);
GameStatus = APPLOGO;
MenuStatus = 0;
logoDelay = 0;
FlashUserState = 0;
bJump = 0;
HitCnt = 0;
//初始化菜单项
//TBuf8<16> s1, h1, a1, q1;
menus.Copy(MENUSELECTSTART);
menuh.Copy(MENUSELECTHELP);
menua.Copy(MENUSELECTABOUT);
menuq.Copy(MENUSELECTQUIT);
//s1.Copy(MENUSELECTSTART);
//h1.Copy(MENUSELECTHELP);
//a1.Copy(MENUSELECTABOUT);
//q1.Copy(MENUSELECTQUIT);
//ConvertGB(s1, menus);
//ConvertGB(h1, menuh);
//ConvertGB(a1, menua);
//ConvertGB(q1, menuq);
bRunStatus = 1;
ActivateL();
LoadScore();
}
// Destructor
CHFloorContainer::~CHFloorContainer()
{
SaveScore();
if (iPeriodicTimer)
{
// Stop the periodic timer
iPeriodicTimer->Cancel();
}
delete imgTitle;
imgTitle = NULL;
delete imgTitleMask;
imgTitleMask = NULL;
delete imgLogo;
imgLogo = NULL;
delete iMAPBHit;
iMAPBHit = NULL;
delete iMAPFall;
iMAPFall = NULL;
delete iMAPHit;
iMAPHit = NULL;
delete iPeriodicTimer;
iPeriodicTimer = NULL;
delete imgBackgroud;
imgBackgroud = NULL;
delete imgHeart;
imgHeart = NULL;
delete imgFloor2;
imgFloor2 = NULL;
delete imgFloor3;
imgFloor3 = NULL;
delete imgFloor4;
imgFloor4 = NULL;
delete imgFloor5;
imgFloor5 = NULL;
delete imgFloor6;
imgFloor6 = NULL;
delete imgFloor7;
imgFloor7 = NULL;
delete imgFloor8;
imgFloor8 = NULL;
delete imgFloor9;
imgFloor9 = NULL;
delete imgFloor10;
imgFloor10 = NULL;
delete imgFloor11;
imgFloor11 = NULL;
delete imgFloor12;
imgFloor12 = NULL;
delete imgWall;
imgWall = NULL;
delete imgBoarder;
imgBoarder = NULL;
delete imgFloor;
imgFloor = NULL;
delete imgTop;
imgTop = NULL;
delete imgTopMask;
imgTopMask = NULL;
for (TInt i = 0; i <= 12; i ++)
{delete imgPlayer[i];
imgPlayer[i] = NULL;
delete imgPlayerMask[i];
imgPlayerMask[i] = NULL;
}
delete iOffScreenBitmap;
iOffScreenBitmap = NULL;
delete iOffScreenBitmapDevice;
iOffScreenBitmapDevice = NULL;
delete iOffScreenBitmapGc;
iOffScreenBitmapGc = NULL;
}
// ---------------------------------------------------------
// CHFloorContainer::SizeChanged()
// Called by framework when the view size is changed
// ---------------------------------------------------------
//
void CHFloorContainer::SizeChanged()
{
// TODO: Add here control resize code etc.
}
// ---------------------------------------------------------
// CHFloorContainer::CountComponentControls() const
// ---------------------------------------------------------
//
TInt CHFloorContainer::CountComponentControls() const
{
return 0; // return nbr of controls inside this container
}
/*
// ---------------------------------------------------------
// CHFloorContainer::ComponentControl(TInt aIndex) const
// ---------------------------------------------------------
//
CCoeControl* CHFloorContainer::ComponentControl(TInt aIndex) const
{
case (aIndex)
{
default :
return NULL;
}
}
*/
// ---------------------------------------------------------
// CHFloorContainer::Draw(const TRect& aRect) const
// ---------------------------------------------------------
//
void CHFloorContainer::Draw(const TRect& /*aRect*/) const
{
//UpdateDisplay();
}
// ---------------------------------------------------------
// CHFloorContainer::HandleControlEventL(
// CCoeControl* aControl,TCoeEvent aEventType)
// ---------------------------------------------------------
//
void CHFloorContainer::HandleControlEventL(
CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
{
// TODO: Add your control event handler code here
}
// End of File
void CHFloorContainer::UpdateDisplay()
{
//
switch (GameStatus)
{
case APPLOGO:
{
DrawLogo();
logoDelay++;
if (logoDelay == 30)
GameStatus = GAMELOG;
break;
}
case GAMELOG:
{
DrawMap();
DrawTitle();
DrawLog();
break;
}
case GAMESTART:
{
if (iIsOverTime)
{
DrawMap();
DrawDemo();
}
else
{
DrawMap();
DrawFloor();
DrawWall();
DrawPlayer();
DrawBoarder();
DrawHP();
DrawScore();
DrawTop();
DrawHitCnt();
}
break;
}
case GAMEOVER:
{
DrawMap();
DrawFloor();
DrawWall();
DrawPlayer();
DrawBoarder();
DrawHP();
DrawScore();
DrawGameOver();
DrawTop();
if (CurScore > HighScore)
HighScore = CurScore;
break;
}
case GAMEABOUT:
{
DrawMap();
DrawLogo();
DrawAbout();
break;
}
case GAMEHELP:
{
DrawMap();
DrawHelp();
break;
}
default: break;
}
CWindowGc& gc = SystemGc();
gc.BitBlt(TPoint(0,0),iOffScreenBitmap);
}
TInt CHFloorContainer::Period(TAny *aPtr)
{
if (((CHFloorContainer*)aPtr)->bRunStatus)
{
((CHFloorContainer*)aPtr)->bRunStatus = 0;
((CHFloorContainer*)aPtr)->DoPeriodTask();
((CHFloorContainer*)aPtr)->bRunStatus = 1;
}
return 1;
}
void CHFloorContainer::DoPeriodTask()
{
// bRunStatus = 0;
//if (mapposx==0) mapposx = -64;
//计算背景图像
if (mapposy == -64) mapposy = 0;
mapposy --;
if (GameStatus == GAMELOG)
{
if (mapposx == -64) mapposx = 0;
mapposx --;
}
//计算左右两侧的强的图像
if (GameStatus == GAMESTART)
{
if (ChkGameOver())
{
GameStatus = GAMEOVER;
iMAPFall->Play();
}
if (wallposy == -16) wallposy = 0;
wallposy -= 2;
//计算阶梯
for (TInt fcnt = 0; fcnt <= FLOORCNT; fcnt ++)
{
if (!bfloorstatus[fcnt])
{
arrfloor[fcnt].iX = 8 + TInt(Math::Random() % 114);
if (!arrfloor[fcnt].iY)
arrfloor[fcnt].iY = fcnt * FLOOROFFPOSY;
else
{
arrfloor[fcnt].iY = FLOORCNT * FLOOROFFPOSY;
}
bfloorstatus[fcnt] = 1;
}
else
{
arrfloor[fcnt].iY -= 2;
if (arrfloor[fcnt].iY == -FLOOROFFPOSY)
{
TInt itype = TInt(Math::Random() % 20);
if (itype>16)
bfloortype[fcnt] = 0;
else{
if (itype > 12)
bfloortype[fcnt] = 1;
else if (itype >8)
bfloortype[fcnt] = 2;
else if (itype >4)
bfloortype[fcnt] = 3;
else
{
bfloortype[fcnt] = 4;
if (Math::Random() % 2)
bfloorscroll[fcnt] = 1;
else
bfloorscroll[fcnt] = -1;
}
}
bfloorstatus[fcnt] = 0;
iScoreStep ++;
if (iScoreStep == 5)
{
CurScore ++;
iScoreStep = 0;
}
}
}
}
}
CWindowGc& gc = SystemGc();
gc.Activate(*DrawableWindow());
UpdateDisplay();
gc.Deactivate();
}
void CHFloorContainer::StartTimer()
{
if (!iPeriodicTimer->IsActive())
{
iPeriodicTimer->Start(INTERALTIME, DELAYTIME, TCallBack(CHFloorContainer::Period, this));
bRunStatus = 1;
}
}
void CHFloorContainer::DrawMap()
{
//画背景
for (TInt mapcnti = 0; mapcnti <= TInt(BACKHEIGHT / 64) + 1; mapcnti ++)
for (TInt mapcntj = 0; mapcntj <= TInt(BACKWIDTH /64) + 1; mapcntj++)
{
iOffScreenBitmapGc->BitBlt(TPoint(mapcntj * 64 + mapposx, mapcnti * 64 + mapposy), imgBackgroud);
}
}
void CHFloorContainer::DrawTitle()
{
NBitmapMethods::BitBltMaskedEntireBitmap(*iOffScreenBitmapGc, TPoint(3, 15), *imgTitle, *imgTitleMask);
}
void CHFloorContainer::DrawLog()
{
iOffScreenBitmapGc->UseFont(LatinBold13());
iOffScreenBitmapGc->SetPenColor(TRgb(100, 100, 100));
iOffScreenBitmapGc->DrawText(menus, TPoint(51, 141));
iOffScreenBitmapGc->DrawText(menuh, TPoint(51, 156));
iOffScreenBitmapGc->DrawText(menua, TPoint(51, 171));
iOffScreenBitmapGc->DrawText(menuq, TPoint(51, 186));
iOffScreenBitmapGc->SetPenColor(TRgb(255, 255, 255));
switch (MenuStatus)
{
case 0:
{
iOffScreenBitmapGc->SetPenColor(TRgb(255, 255, 0));
iOffScreenBitmapGc->DrawText(menus, TPoint(50, 140));
iOffScreenBitmapGc->SetPenColor(TRgb(255, 255, 255));
iOffScreenBitmapGc->DrawText(menuh, TPoint(50, 155));
iOffScreenBitmapGc->DrawText(menua, TPoint(50, 170));
iOffScreenBitmapGc->DrawText(menuq, TPoint(50, 185));
break;
}
case 1:
{
iOffScreenBitmapGc->DrawText(menus, TPoint(50, 140));
iOffScreenBitmapGc->SetPenColor(TRgb(255, 255, 0));
iOffScreenBitmapGc->DrawText(menuh, TPoint(50, 155));
iOffScreenBitmapGc->SetPenColor(TRgb(255, 255, 255));
iOffScreenBitmapGc->DrawText(menua, TPoint(50, 170));
iOffScreenBitmapGc->DrawText(menuq, TPoint(50, 185));
break;
}
case 2:
{
iOffScreenBitmapGc->DrawText(menus, TPoint(50, 140));
iOffScreenBitmapGc->DrawText(menuh, TPoint(50, 155));
iOffScreenBitmapGc->SetPenColor(TRgb(255, 255, 0));
iOffScreenBitmapGc->DrawText(menua, TPoint(50, 170));
iOffScreenBitmapGc->SetPenColor(TRgb(255, 255, 255));
iOffScreenBitmapGc->DrawText(menuq, TPoint(50, 185));
break;
}
case 3:
{
iOffScreenBitmapGc->DrawText(menus, TPoint(50, 140));
iOffScreenBitmapGc->DrawText(menuh, TPoint(50, 155));
iOffScreenBitmapGc->DrawText(menua, TPoint(50, 170));
iOffScreenBitmapGc->SetPenColor(TRgb(255, 255, 0));
iOffScreenBitmapGc->DrawText(menuq, TPoint(50, 185));
break;
}
}
}
void CHFloorContainer::DrawWall()
{
for (TInt wallcnti = 0; wallcnti <= TInt(BACKHEIGHT / 16); wallcnti++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -