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

📄 ppoverview.cpp

📁 一个点泡泡游戏
💻 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 + -