📄 ppoverview.cpp
字号:
// PPOverView.cpp: implementation of the CPPOverView class.
//
//////////////////////////////////////////////////////////////////////
#include "PPOverView.h"
#include "PPKeyControl.h"
#include "AEEStdLib.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPPOverView::CPPOverView()
{
}
CPPOverView::CPPOverView(CPPGameDoc* pDoc)
{
SetDocument(pDoc);
}
CPPOverView::~CPPOverView()
{
}
bool CPPOverView::OnInitData()
{
m_pIFileMgr = NULL;
m_pIFile = NULL;
m_nSpecialFont = -1;
int i = 0;
for (i = 0; i < 5; i++)
{
m_tScore[i].nScore = 0;
m_tScore[i].nLevel = 0;
}
CPPGameApp* pApp = (CPPGameApp*) GETAPPINSTANCE();
if (pApp == NULL)
return false;
BEGIN_CHECK
{
// 创建文件接口
CHECK_ERROR(ISHELL_CreateInstance(pApp->m_pIShell, AEECLSID_FILEMGR, (void**)&m_pIFileMgr));
}
CATCH_CHECK
{
IRELEASE(m_pIFileMgr, FILEMGR);
return false;
}
END_CHECK
// 文件不存在,创建文件
if (IFILEMGR_Test(m_pIFileMgr, SCORE_FILE_NAME) == SUCCESS)
{
// 打开排行榜文件
m_pIFile = IFILEMGR_OpenFile(m_pIFileMgr, SCORE_FILE_NAME, _OFM_READWRITE);
if (m_pIFile == NULL)
{
IRELEASE(m_pIFileMgr, FILEMGR);
return false;
}
// 将原始数据读出
ReadFileData();
// 关闭文件
IFILE_Release(m_pIFile);
}
else
{
m_pIFile = IFILEMGR_OpenFile(m_pIFileMgr, SCORE_FILE_NAME, _OFM_CREATE);
if (m_pIFile == NULL)
{
IRELEASE(m_pIFileMgr, FILEMGR);
return false;
}
// 关闭文件
IFILE_Release(m_pIFile);
}
int nTempScore = 0;// 存储临时数据
int nTempLevel = 0;// 存储临时数据
// 初始化原始排行榜值,将得分写入排行榜数据
for (i = 0; i < 5; i++)
{
if (m_pDoc->m_tGameScore.nScore > m_tScore[i].nScore)
{
nTempScore = m_tScore[i].nScore;
nTempLevel = m_tScore[i].nLevel;
m_tScore[i].nScore = m_pDoc->m_tGameScore.nScore;
m_tScore[i].nLevel = m_pDoc->m_tGameScore.nLevel;
m_nSpecialFont = i;
for (int j = 4; j > i; j--)
{
if(j != i + 1)
{
m_tScore[j].nScore = m_tScore[j - 1].nScore;
m_tScore[j].nLevel = m_tScore[j - 1].nLevel;
}
else
{
m_tScore[j].nScore = nTempScore;
m_tScore[j].nLevel = nTempLevel;
}
}
break;
}
}
// 写文件数据
WriteFileData();
// 将键盘按键全部清空
m_pDoc->GetKeyControl()->InitData();
IRELEASE(m_pIFileMgr, FILEMGR);
return true;
}
void CPPOverView::ReadFileData()
{
FileInfo fileinfo;
// 获取文件信息
IFILE_GetInfo(m_pIFile, &fileinfo);
int nRecordNum = fileinfo.dwSize / sizeof(GAMESCORE);
for (int i =0; i < nRecordNum; i++)
{
if (IFILE_Seek(m_pIFile, _SEEK_START, sizeof(GAMESCORE) * i) != SUCCESS)
return;
IFILE_Read(m_pIFile, &m_tScore[i], sizeof(GAMESCORE));
}
}
void CPPOverView::OnStartView()
{
// 初始化对象
if (!OnInitData())
{
Release();
return;
}
m_pDoc->SetCurView(this);
// 将定时器与回调函数关联
CALLBACK_Init(&m_cbTimer, (PFNNOTIFY)HandleTimer, this);
OnSetTimer();
}
void CPPOverView::Release()
{
// 释放文件控制数据
IRELEASE(m_pIFileMgr, FILEMGR);
// IFILE_Release(m_pIFile);
}
void CPPOverView::HandleTimer(void* pView)
{
((CPPOverView* )pView)->OnTimer();
}
void CPPOverView::OnTimer()
{
// 重新计算数据
if (m_pDoc == NULL)
return;
// 在Doc里处理按键事件
if (!m_pDoc->UpdateOverView())
return;
// 显示得分数据
// 获取应用程序指针
CPPGameApp* pApp = (CPPGameApp*) GETAPPINSTANCE();
if (pApp == NULL)
{
return;
}
BEGIN_CHECK
{
// 取app指针
CHECK_NULL(pApp, (CPPGameApp*) GETAPPINSTANCE());
CHECK_ERROR(ISHELL_SetTimerEx(pApp->m_pIShell, TIME_VIEW, &m_cbTimer));
}
CATCH_CHECK
{
return;
}
END_CHECK
}
void CPPOverView::OnSetTimer()
{
AECHAR str[5];
MEMSET(str, 0, 10);
int nScore = 0;
int nLevel = 0;
CPPGameApp* pApp = (CPPGameApp*) GETAPPINSTANCE();
if (pApp == NULL)
return;
// 清屏
IDISPLAY_ClearScreen (pApp->m_pIDisplay); // 清除屏幕
// 设置背景色
IGraphics* pIGraphics = NULL;
if (ISHELL_CreateInstance(pApp->m_pIShell, AEECLSID_GRAPHICS, (void** )&pIGraphics) == SUCCESS)
{
IGRAPHICS_SetBackground(pIGraphics, 0, 0, 0);
IGRAPHICS_ClearViewport(pIGraphics);
// 设置字体颜色
IDISPLAY_SetColor(pApp->m_pIDisplay, CLR_USER_TEXT, MAKE_RGB(0, 255, 0));
}
// 输入排行榜
ISHELL_LoadResString(pApp->m_pIShell, PP_RES_FILE, IDS_SCORE_LIST, str, 10);
IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_NORMAL, str, -1, 50, 0, NULL, IDF_ALIGN_CENTER | IDF_TEXT_TRANSPARENT);
MEMSET(str, 0, 5);
// 列表名称
ISHELL_LoadResString(pApp->m_pIShell, PP_RES_FILE, IDS_SCORE, str, 10);
IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_NORMAL, str, -1, 20, 18, NULL, IDF_ALIGN_NONE | IDF_TEXT_TRANSPARENT);
MEMSET(str, 0, 5);
ISHELL_LoadResString(pApp->m_pIShell, PP_RES_FILE, IDS_LEVEL, str, 10);
IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_NORMAL, str, -1, 110, 18, NULL, IDF_ALIGN_RIGHT | IDF_TEXT_TRANSPARENT);
// 循环输入成绩
for (int i = 0; i < 5; i++)
{
if (m_nSpecialFont == i)
{
AEERect rect;
rect.x = 10;
rect.y = 33 + i * 17;
rect.dx = 115;
rect.dy = 20;
// 设置字体颜色
IDISPLAY_SetColor(pApp->m_pIDisplay, CLR_USER_TEXT, MAKE_RGB(255, 0, 0));
// 画框
IDISPLAY_DrawRect(pApp->m_pIDisplay, &rect, 5, 31, IDF_RECT_FRAME);
MEMSET(str, 0, 5);
GetDataItoA(m_tScore[i].nScore, str);
IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_BOLD, str, -1, 15, 37 + i * 17,
NULL, IDF_ALIGN_NONE | IDF_TEXT_TRANSPARENT);
MEMSET(str, 0, 5);
GetDataItoA(m_tScore[i].nLevel, str);
IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_BOLD, str, -1, 95, 37 + i * 17,
NULL, IDF_ALIGN_NONE | IDF_TEXT_TRANSPARENT);
// 还原字体颜色
IDISPLAY_SetColor(pApp->m_pIDisplay, CLR_USER_TEXT, MAKE_RGB(0, 255, 0));
}
else
{
MEMSET(str, 0, 5);
GetDataItoA(m_tScore[i].nScore, str);
IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_BOLD, str, -1, 15, 37 + i * 17,
NULL, IDF_ALIGN_NONE | IDF_TEXT_TRANSPARENT);
MEMSET(str, 0, 5);
GetDataItoA(m_tScore[i].nLevel, str);
IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_BOLD, str, -1, 95, 37 + i * 17,
NULL, IDF_ALIGN_NONE | IDF_TEXT_TRANSPARENT);
}
}
// 输入“返回”或“重新开始”
ISHELL_LoadResString(pApp->m_pIShell, PP_RES_FILE, IDS_RESTART_GAME, str, 10);
IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_NORMAL, str, -1, 0, 124, NULL, IDF_ALIGN_LEFT | IDF_ALIGN_BOTTOM | IDF_TEXT_TRANSPARENT);
ISHELL_LoadResString(pApp->m_pIShell, PP_RES_FILE, IDS_RETURN_MENU, str, 10);
IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_NORMAL, str, -1, 124, 124, NULL, IDF_ALIGN_RIGHT | IDF_ALIGN_BOTTOM | IDF_TEXT_TRANSPARENT);
IDISPLAY_Update (pApp->m_pIDisplay);// 在屏幕上刷新输出内容
// 释放资源
IGRAPHICS_Release(pIGraphics);
// 设置定时器
SetTimer(TIME_VIEW, (PFNNOTIFY)(CPPOverView::HandleTimer));
}
bool CPPOverView::SetTimer(int32 dwInterval, PFNNOTIFY pfnCallback)
{
CPPGameApp* pApp = NULL;
BEGIN_CHECK
{
// 取app指针
CHECK_NULL(pApp, (CPPGameApp*) GETAPPINSTANCE());
CHECK_ERROR(ISHELL_SetTimerEx(pApp->m_pIShell, dwInterval, &m_cbTimer));
}
CATCH_CHECK
{
return false;
}
END_CHECK
return true;
}
void CPPOverView::GetDataItoA(int nData, AECHAR *psz)
{
int nSrcData = nData;
int nTempData = 0;
int i = 0;
for (i = 4 ; i >= 0; i--)
{
nTempData = nSrcData % 10;
nSrcData = nSrcData / 10;
if (nTempData != 0)
psz[i] = nTempData + '0';
else
{
if (nSrcData == 0)
psz[i] = ' ';
else
psz[i] = '0';
}
}
psz[5] = '\0';
}
void CPPOverView::ExitView(int nViewID)
{
// 释放资源
Release();
// 设置定时器结束标志
m_pDoc->SetExitTimer(true);
// 结束定时器
CALLBACK_Cancel(&m_cbTimer);
m_pDoc->SwitchView(nViewID);
}
void CPPOverView::WriteFileData()
{
CPPGameApp* pApp = (CPPGameApp*) GETAPPINSTANCE();
if (pApp == NULL)
return;
// 文件不存在,创建文件
if (IFILEMGR_Test(m_pIFileMgr, SCORE_FILE_NAME) == SUCCESS)
{
// 打开排行榜文件
m_pIFile = IFILEMGR_OpenFile(m_pIFileMgr, SCORE_FILE_NAME, _OFM_READWRITE);
if (m_pIFile == NULL)
{
return;
}
// 写数据
for (int i = 0; i < 5; i++)
{
if (IFILE_Seek(m_pIFile, _SEEK_START, sizeof(GAMESCORE) * i) != SUCCESS)
{
IFILE_Release(m_pIFile);
return;
}
IFILE_Write(m_pIFile, &m_tScore[i], sizeof(GAMESCORE));
}
// 关闭文件
IFILE_Release(m_pIFile);
}
else
{
m_pIFile = IFILEMGR_OpenFile(m_pIFileMgr, SCORE_FILE_NAME, _OFM_CREATE);
if (m_pIFile == NULL)
{
return;
}
// 写数据
for (int i = 0; i < 5; i++)
{
if (IFILE_Seek(m_pIFile, _SEEK_START, sizeof(GAMESCORE) * i) != SUCCESS)
{
IFILE_Release(m_pIFile);
return;
}
IFILE_Write(m_pIFile, &m_tScore[i], sizeof(GAMESCORE));
}
// 关闭文件
IFILE_Release(m_pIFile);
}
}
void CPPOverView::OnSuspend()
{
// 结束定时器
CALLBACK_Cancel(&m_cbTimer);
// 释放资源
CPPBaseView::OnSuspend();
}
void CPPOverView::OnResume()
{
CPPBaseView::OnResume();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -