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

📄 gamedoc.cpp

📁 看到有兄弟提出的半透明算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// GameDoc.cpp: implementation of the JFZGameDoc class.
//
//////////////////////////////////////////////////////////////////////

#include "GameDoc.h"
#include "KeyControl.h"
#include "BaseView.h"
#include "LogoView.h"
#include "MenuView.h"
#include "AboutView.h"
#include "HelpView.h"
#include "OptView.h"
#include "GameView.h"
#include "OverView.h"
#include "Bitmap.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGameDoc::CGameDoc()
{

}

CGameDoc::~CGameDoc()
{

}

CGameDoc* CGameDoc::CreateInstance()
{
	// 创建新的CBDocument实例
	CGameDoc* pObj = new CGameDoc();
	
	// 如果实例创建成功,调用初始化函数
	if (pObj)
	{
		if (!pObj->InitData())
		{
			pObj->Release();
			pObj = NULL;
		}
	}

	// 返回实例指针
	return pObj;
}

void CGameDoc::Release()
{
	FreeData();
	if (this)
		delete this;
}

void CGameDoc::FreeData()
{
}

void CGameDoc::SetApp(CGameApp* pApp)
{
	m_pApp = pApp;
}

boolean CGameDoc::SetControl(CKeyControl *pControl)
{
	BEGIN_CHECK
	{
		CHECK_NULL(m_pKeyControl, pControl);
	}
	CATCH_CHECK
	{
		CUSTOM_RELEASE(m_pKeyControl);
		return false;
	}
	END_CHECK
		
		return true;
}

CKeyControl* CGameDoc::GetKeyControl()
{
	return m_pKeyControl;
}

CBaseView* CGameDoc::GetCurView()
{
	return m_pCurView;
}

boolean CGameDoc::SetCurView(CBaseView* pCurView)
{
	BEGIN_CHECK
	{
		CHECK_NULL(m_pCurView, pCurView);
	}
	CATCH_CHECK
	{
		CUSTOM_RELEASE(m_pCurView);
		return false;
	}
	END_CHECK

	return true;
}

bool CGameDoc::InitData()
{
	m_pLogoView = NULL;
	m_pMenuView = NULL;
	m_pAboutView = NULL;
	m_pHelpView = NULL;
	m_pOptView = NULL;
	m_pGameView = NULL;
	m_pOverView = NULL;

	// 初始化当前视图为开始视图
	m_nCurViewID = ID_VIEW_START;

	m_bExitTimer = false;

	// 初始化其它数据
	return TRUE;
}

void CGameDoc::ReleaseView()
{
	if (m_pLogoView)
	{
		m_pLogoView->FreeResourse();
		delete m_pLogoView;
		m_pLogoView = NULL;
	}
	
	if (m_pMenuView)
	{
		m_pMenuView->FreeResourse();
		delete m_pMenuView;
		m_pMenuView = NULL;
	}

	if (m_pAboutView)
	{
		m_pAboutView->FreeResourse();
		delete m_pAboutView;
		m_pAboutView = NULL;
	}

	if (m_pGameView)
	{
		m_pGameView->FreeResourse();
		delete m_pGameView;
		m_pGameView = NULL;
	}

	if (m_pHelpView)
	{
		m_pHelpView->FreeResourse();
		delete m_pHelpView;
		m_pHelpView = NULL;
	}

//	if (m_pOptView)
//	{
//		m_pOptView->FreeResourse();
//		delete m_pOptView;
//		m_pOptView = NULL;
//	}

	if (m_pOverView)
	{
		m_pOverView->FreeResourse();
		delete m_pOverView;
		m_pOverView = NULL;
	}
}

void CGameDoc::SetLogoView(CLogoView* pLogoView)
{
	m_pLogoView = pLogoView;
}

void CGameDoc::SwitchView(int16 nViewID)
{
	// 切换视图前,全部释放
	ReleaseView();

	SetCurViewID(nViewID);
	
	CBaseView* pView = NULL;
	switch (nViewID)
	{
//	case ID_VIEW_START:
//		break;
	case ID_VIEW_MENU:
		{
			m_pMenuView = new CMenuView(this);

			// 设置文档关联对象,开始时设置当前视图为开始 
			SetMenuView(m_pMenuView);
			// 首先进入开始视图
			m_pMenuView->OnStartView();
		}
		break;
	case ID_VIEW_GAME:
		{
			m_pGameView = new CGameView(this);
			
			// 设置文档关联对象,开始时设置当前视图为开始 
			SetGameView(m_pGameView);
			// 首先进入开始视图
			m_pGameView->OnStartView();
		}
		break;
	case ID_VIEW_ABOUT:
		{
			m_pAboutView = new CAboutView(this);

			// 设置文档关联对象,开始时设置当前视图为开始 
			SetAboutView(m_pAboutView);
			// 首先进入开始视图
			m_pAboutView->OnStartView();
		}
		break;
	case ID_VIEW_HELP:
		{
			m_pHelpView = new CHelpView(this);

			// 设置文档关联对象,开始时设置当前视图为开始 
			SetHelpView(m_pHelpView);
			// 首先进入开始视图
			m_pHelpView->OnStartView();
		}
		break;
//	case ID_VIEW_SET:
//		{
//			m_pOptView = new JFZOptView(this);
//			
//			// 设置文档关联对象,开始时设置当前视图为开始 
//			SetOptView(m_pOptView);
//			// 首先进入开始视图
//			m_pOptView->OnStartView();
//		}
//		break;
//	case ID_VIEW_STOP:
//		{
//			m_pOverView = new JFZOverView(this);
//			
//			// 设置文档关联对象,开始时设置当前视图为开始 
//			SetOverView(m_pOverView);
//			// 首先进入开始视图
//			m_pOverView->OnStartView();
//		}
//		break;
	default:
		break;
	}
}

void CGameDoc::SetCurViewID(int16 nViewID)
{
	m_nCurViewID = nViewID;
}

void CGameDoc::SetMenuView(CMenuView* pMenuView)
{
	m_pMenuView = pMenuView;
}

CMenuView* CGameDoc::GetMenuView()
{
	return m_pMenuView;
}

boolean CGameDoc::UpdateMenuView()
{
	// 处理按键事件
	HandleKeyEvent();
	
	if (IsExitTimer())
	{
		SetExitTimer(false);
		return false;
	}
	else
		return true;

	return false;
}

void CGameDoc::HandleKeyEvent()
{
	// 判断是否有键按下,没有键按下不处理
	switch (m_nCurViewID)
	{
	case ID_VIEW_START:
		if (m_pKeyControl->IsAnyKeyPress())
		{
			m_pLogoView->ExitView();
		}
		break;
	case ID_VIEW_MENU:
		HandleMenuKey(m_pKeyControl);
		break;
	case ID_VIEW_ABOUT:
		HandleAboutKey(m_pKeyControl);
		break;
	case ID_VIEW_HELP:
		HandleHelpKey(m_pKeyControl);
		break;
//	case ID_VIEW_SET:
//		HandleOptKey(m_pKeyControl);
//		break;
//	case ID_VIEW_STOP:
//		if (m_pKeyControl->IsAnyKeyPress())
//		{
//			m_pOverView->m_bReturnMeun = true;
//		}
//		break;
	case ID_VIEW_GAME:
		HandleGameKey(m_pKeyControl);
		break;
	default:
		break;
	}
}

void CGameDoc::HandleMenuKey(CKeyControl *pControl)
{
	int nMenuIndex = m_pMenuView->GetMenuIndex(m_pMenuView->m_eCurMenu);
	int nHitCount = 0;
	
	nHitCount = m_pKeyControl->GetKeyHitCounts(EKEY_LEFT);
	if (nHitCount != AVLID_KEY_PRESS_NUM)
	{
		if (pControl->GetKeyPressStatus(EKEY_LEFT) == false)
		{
			if (m_pMenuView->m_eCurMenu != EMENU_START)
			{
				if (nHitCount >= nMenuIndex)
				{
					// 按键次数大于或等于索引数,当前菜单项置为“开始”
					MAINMENU eMenu = m_pMenuView->GetMenuFromIndex(MENU_TEXT_NUM - (nHitCount - nMenuIndex));
					m_pMenuView->m_eCurMenu = eMenu;
				}
				else
				{
					// 设置当前高亮菜单
					MAINMENU eMenu = m_pMenuView->GetMenuFromIndex(nMenuIndex - nHitCount);
					m_pMenuView->m_eCurMenu = eMenu;
				}
			}
			else
				m_pMenuView->m_eCurMenu = EMENU_STOP;

			pControl->SetKeyPressStatus(EKEY_LEFT, true);
		}
	}

	// 判断下按键
	nHitCount = pControl->GetKeyHitCounts(EKEY_RIGHT);
	if (nHitCount != AVLID_KEY_PRESS_NUM)
	{
		if (pControl->GetKeyPressStatus(EKEY_RIGHT) == false)
		{
			if (m_pMenuView->m_eCurMenu != EMENU_STOP)
			{
				if (nHitCount > (MENU_TEXT_NUM - nMenuIndex))
				{
					MAINMENU eMenu = m_pMenuView->GetMenuFromIndex(nHitCount - (MENU_TEXT_NUM - nMenuIndex));
					m_pMenuView->m_eCurMenu = eMenu;
				}
				else
				{
					MAINMENU eMenu = m_pMenuView->GetMenuFromIndex(nMenuIndex + nHitCount);
					m_pMenuView->m_eCurMenu = eMenu;
				}
			}
			else
				m_pMenuView->m_eCurMenu = EMENU_START;

			pControl->SetKeyPressStatus(EKEY_RIGHT, true);
		}
	}

	// 判断选择键
	nHitCount = pControl->GetKeyHitCounts(EKEY_SELECT);
	if (nHitCount != AVLID_KEY_PRESS_NUM)
	{
		if (pControl->GetKeyPressStatus(EKEY_SELECT) == false)
		{
			pControl->SetKeyPressStatus(EKEY_SELECT, true);

			m_bContinueGame = FALSE;
			// 继续
			if (m_pMenuView->m_eCurMenu == EMENU_CONTINUE)
			{
				m_bContinueGame = TRUE;
			}
			// 按下选择键,进入相应的视图界面
			int nViewID = GetViewID();

			m_pMenuView->ExitView(nViewID);
		}
	}
}

int CGameDoc::GetViewID()
{
	int nViewID = 0;
	MAINMENU eMenu = m_pMenuView->m_eCurMenu;
	
	switch (eMenu)
	{
	case EMENU_START:
		nViewID = ID_VIEW_GAME;
		break;
//	case EMENU_OPTION:
//		nViewID = ID_VIEW_SET;
//		break;
	case EMENU_HELP:
		nViewID = ID_VIEW_HELP;
		break;
	case EMENU_ABOUT:
		nViewID = ID_VIEW_ABOUT;
		break;
	case EMENU_STOP:
		nViewID = ID_VIEW_STOP;
		break;
	default:
		nViewID = ID_VIEW_MENU;
		break;
	}
	
	return nViewID;
}

void CGameDoc::SetAboutView(CAboutView* pAoutView)
{
	m_pAboutView = pAoutView;
}

boolean CGameDoc::IsExitTimer()
{
	return m_bExitTimer;
}

void CGameDoc::SetExitTimer(boolean bExit)
{
	m_bExitTimer = bExit;
}

boolean CGameDoc::UpdateLogoView()
{
	// 处理按键事件
	HandleKeyEvent();

	if(IsExitTimer())
	{
		m_bExitTimer = false;
		return false;
	}
	else
	{
		return true;
	}
	return false;
}

boolean CGameDoc::UpdateAboutView()
{
	// 处理按键事件
	HandleKeyEvent();
	
	if (IsExitTimer())
	{
		m_bExitTimer = false;
		return false;
	}
	else
		return true;
	
	return false;
}

void CGameDoc::HandleAboutKey(CKeyControl* pControl)
{
	int nHitCount = 0;
	// 判断选择键
	nHitCount = pControl->GetKeyHitCounts(EKEY_SELECT) + pControl->GetKeyHitCounts(EKEY_CLR);
	if (nHitCount != AVLID_KEY_PRESS_NUM)
	{
		if ((pControl->GetKeyPressStatus(EKEY_SELECT)) == false
			&& (pControl->GetKeyPressStatus(EKEY_CLR)) == false)
		{
			pControl->SetKeyPressStatus(EKEY_SELECT, true);
			pControl->SetKeyPressStatus(EKEY_CLR, true);
			m_pAboutView->ExitView();
		}
	}
	// 判断向下键
	nHitCount = pControl->GetKeyHitCounts(EKEY_DOWN);
	if (nHitCount != AVLID_KEY_PRESS_NUM)
	{
		if ((pControl->GetKeyPressStatus(EKEY_DOWN)) == false)
		{
			if (m_pAboutView->m_nTextIndex < 3)
				m_pAboutView->m_nTextIndex++;
			pControl->SetKeyPressStatus(EKEY_DOWN, true);
		}
	}
	// 判断向上键
	nHitCount = pControl->GetKeyHitCounts(EKEY_UP);
	if (nHitCount != AVLID_KEY_PRESS_NUM)
	{
		if ((pControl->GetKeyPressStatus(EKEY_UP)) == false)
		{
			if (m_pAboutView->m_nTextIndex > 0)
				m_pAboutView->m_nTextIndex--;
			pControl->SetKeyPressStatus(EKEY_UP, true);
		}
 	}
}

void CGameDoc::SetHelpView(CHelpView* pHelpView)
{
	m_pHelpView = pHelpView;
}

boolean CGameDoc::UpdateHelpView()
{
	// 处理按键事件
	HandleKeyEvent();
	
	if (IsExitTimer())
	{
		m_bExitTimer = false;
		return false;
	}
	else
		return true;
	
	return false;
}

void CGameDoc::HandleHelpKey(CKeyControl* pControl)
{
	int nHitCount = 0;
	// 判断选择键
	nHitCount = pControl->GetKeyHitCounts(EKEY_SELECT) + pControl->GetKeyHitCounts(EKEY_CLR);
	if (nHitCount != AVLID_KEY_PRESS_NUM)
	{
		if ((pControl->GetKeyPressStatus(EKEY_SELECT)) == false
			&& (pControl->GetKeyPressStatus(EKEY_CLR)) == false)
		{
			pControl->SetKeyPressStatus(EKEY_SELECT, true);
			pControl->SetKeyPressStatus(EKEY_CLR, true);
			m_pHelpView->ExitView();
		}
	}
	// 判断向下键
	nHitCount = pControl->GetKeyHitCounts(EKEY_DOWN);
	if (nHitCount != AVLID_KEY_PRESS_NUM)
	{
		if ((pControl->GetKeyPressStatus(EKEY_DOWN)) == false)
		{
			if (m_pAboutView->m_nTextIndex < 3)
				m_pAboutView->m_nTextIndex++;
			pControl->SetKeyPressStatus(EKEY_DOWN, true);
		}
	}
	// 判断向上键
	nHitCount = pControl->GetKeyHitCounts(EKEY_UP);
	if (nHitCount != AVLID_KEY_PRESS_NUM)
	{
		if ((pControl->GetKeyPressStatus(EKEY_UP)) == false)
		{
			if (m_pAboutView->m_nTextIndex > 0)
				m_pAboutView->m_nTextIndex--;
			pControl->SetKeyPressStatus(EKEY_UP, true);
		}
 	}
}

//void JFZGameDoc::SetOptView(JFZOptView* pOptView)
//{
//	m_pOptView = pOptView;
//}
//
//boolean JFZGameDoc::UpdateOptView()
//{
//	// 处理按键事件
//	HandleKeyEvent();

⌨️ 快捷键说明

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