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

📄 gameobjectslider.cpp

📁 游戏框架
💻 CPP
字号:
// ***************************************************************
//  GameObject   version:  1.0
//  -------------------------------------------------------------
//	File Name:	GameObjectSlider.cpp
//	Created:	2007/07/31
//	Modified:	2007/07/31   23:28
//	Author:		William.Liang
//  Msn:		lwq49@msn.com
//  Email:		lwq49@21cn.com, lwq49@msn.com
//	Description:
//
//	Purpose:	
//  -------------------------------------------------------------
//  license:
//
//  The contents of this file are subject to the Mozilla Public
//  License Version 1.1 (the "License"); you may not use this file
//  except in compliance with the License. You may obtain a copy
//  of the License at http://www.mozilla.org/MPL/ Software dis-
//  tributed under the License is distributed on an "AS IS" 
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or im-
//  plied. See the License for the specific language governing
//  rights and limitations under the License.
//
//  The Initial Developer of the Original Code is William.Liang .
//  Copyright (C) 2007 - All Rights Reserved.
// ***************************************************************

#include "StdAfx.h"
#include ".\gameobjectslider.h"

CGameObjectSlider::CGameObjectSlider(void)
{
	m_pResource		= NULL;
	m_wCurrent		= 0;
	m_wMax			= 1;
	m_wMin			= 0;
	m_wStep			= 1;
	m_wSliderType	= CN_SLIDER_TYPE_NORMAL;
	m_wDirection	= CN_SLIDER_DIRECTION_LEFTRIGHT;
	m_bDropping		= false;
	m_hWnd			= NULL;
	m_BasalInfo.Disabled		= false;

}

CGameObjectSlider::~CGameObjectSlider(void)
{
}

//计算间隔
void CGameObjectSlider::CalcInterval(){
	_SIZE siBarSize = m_GOBar.GetSize();
	_SIZE siBlockSize = m_GOBlock.GetSize();
	if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT){
		m_siInterval.cy = 0;
		m_siInterval.cx = (siBarSize.cx - (m_wSliderType==CN_SLIDER_TYPE_NORMAL?siBlockSize.cx:0))/(m_wMax - m_wMin);
	}
	else{
		m_siInterval.cx = 0;
		m_siInterval.cy = (siBarSize.cy - (m_wSliderType==CN_SLIDER_TYPE_EXTEND?siBlockSize.cy:0))/(m_wMax - m_wMin);
	}
}

//对象创建
bool CGameObjectSlider::Create(LPCTSTR lpName, _SIZE siSize, CResource* pResource, _RECT rcBar, _RECT rcBlock, WORD wSliderType, WORD wDirection, WORD wMax, WORD wMin, WORD wStep){
	__super::Create(lpName, siSize, Type_Slider);

	m_pResource = pResource;
	m_wMax		= wMax;
	m_wMin		= wMin;
	m_wStep		= wStep;
	m_GOBar.Create("Bar", _SIZE(rcBar.right-rcBar.left, rcBar.bottom-rcBar.top), pResource);
	m_GOBar.SetTextureSize(rcBar);

	m_GOBlock.Create("Block", _SIZE(rcBlock.right-rcBlock.left, rcBlock.bottom-rcBlock.top), pResource);
	m_GOBlock.SetTextureSize(rcBlock);

	Add(GET_OBJECT_INTERFACE(m_GOBar, IGameObject), "Bar");
	Add(GET_OBJECT_INTERFACE(m_GOBlock, IGameObject), "Block");

	SetSliderType(wSliderType);
	SetDirection(wDirection);

	m_hWnd = m_pResource->GetGDI()->System_GetState(HGE_HWND);

	return true;
}

//渲染对象
void CGameObjectSlider::Render(WPARAM wParam){
	m_GOBar.Render(wParam);
	m_GOBlock.Render(wParam);
}

//调整当前值
bool CGameObjectSlider::Increase(bool bFlag){

	if(bFlag && m_wCurrent>=m_wMax) return false;
	if(!bFlag && m_wCurrent<=m_wMin) return false;

	SetCurrent(m_wCurrent+(bFlag?1:-1));

	return true;
}

//返回当前值
WORD CGameObjectSlider::GetCurrent(){
	return m_wCurrent;
}

//返回增长方向
WORD CGameObjectSlider::GetDirection(){
	return m_wDirection;
}

//返回最大值
WORD CGameObjectSlider::GetMax(){
	return m_wMax;
}

//返回最小值
WORD CGameObjectSlider::GetMin(){
	return m_wMin;
}

//返回滑动类型
WORD CGameObjectSlider::GetSliderType(){
	return m_wSliderType;
}

//返回步长值
WORD CGameObjectSlider::GetStep(){
	return m_wStep;
}

//设置BAR的纹理区域
void CGameObjectSlider::SetBarRect(_RECT rcRect){
	m_GOBar.SetTextureSize(rcRect);
}

//设置BLOCK的纹理区域
void CGameObjectSlider::SetBlockRect(_RECT rcRect){
	m_GOBlock.SetTextureSize(rcRect);
}

//设置当前值
void CGameObjectSlider::SetCurrent(WORD wCurrent){
	WORD	wOrignal = m_wCurrent;
	m_wCurrent = wCurrent;

	//计算位置的位标
	_POINT piBlockPos = m_GOBlock.GetLocalPosition();

	if(m_wDirection==1 || m_wDirection==2){
		//水平方向
		piBlockPos.x = m_siInterval.cx*((m_wDirection==1?m_wCurrent:m_wMax-m_wCurrent)-m_wMin);
	}
	else{
		//垂直方向
		piBlockPos.y = m_siInterval.cy*((m_wDirection==3?m_wCurrent:m_wMax-m_wCurrent)-m_wMin);
	}

	if(m_wSliderType==CN_SLIDER_TYPE_NORMAL){
		//移动至新位置
		m_GOBlock.MoveTo(piBlockPos);
	}
	else{
		//需要重计移动块的大小
		_RECT	rcSize = m_GOBlock.GetTextureSize();
		switch(m_wDirection){
			case CN_SLIDER_DIRECTION_LEFTRIGHT:
				rcSize.right = piBlockPos.x;
				break;
			case CN_SLIDER_DIRECTION_TOPBOTTOM:
				rcSize.bottom = piBlockPos.y;
				break;
			case CN_SLIDER_DIRECTION_RIGHTLEFT:
				{
					_SIZE siBarSize = m_GOBar.GetSize();
					rcSize.right = siBarSize.cx - piBlockPos.x;
					//移动至新位置
					m_GOBlock.MoveTo(piBlockPos);
				}
				break;
			case CN_SLIDER_DIRECTION_BOTTOMTOP:
				{
					_SIZE siBarSize = m_GOBar.GetSize();
					rcSize.bottom = siBarSize.cy - piBlockPos.y;
					//移动至新位置
					m_GOBlock.MoveTo(piBlockPos);
				}
				break;
		}

		//重置物件及纹理的大小
		m_GOBlock.SetTextureSize(rcSize);
		m_GOBlock.SetSize(_SIZE(rcSize.right, rcSize.bottom));
	}

	CONTROLMESSAGE*		tagControlMsg = new CONTROLMESSAGE;

	tagControlMsg->lpVoid = this;
	tagControlMsg->wParam = m_wCurrent;
	tagControlMsg->lParam = wOrignal;
	PostMessage(m_hWnd, CN_CONTROL_MESSAGE, (WPARAM)(tagControlMsg), sizeof(CONTROLMESSAGE));
}

//设置增长方向
void CGameObjectSlider::SetDirection(WORD wDirection){
	m_wDirection = wDirection;

	_SIZE	siBarSize = m_GOBar.GetSize();
	_SIZE	siBlockSize = m_GOBlock.GetSize();
	_POINT	piBarPoint;

	//BAR按方向居中及设置块的大小
	if(m_wDirection == CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection == CN_SLIDER_DIRECTION_RIGHTLEFT){
		//BAR垂直居中
		piBarPoint.y = (m_BasalInfo.Size.cy - siBarSize.cy)/2;
		if(m_wSliderType==CN_SLIDER_TYPE_EXTEND){
			siBlockSize.cx = 0;
			m_GOBlock.SetSize(siBlockSize);
		}
	}
	else{
		//BAR水平居中
		piBarPoint.x = (m_BasalInfo.Size.cx - siBarSize.cx)/2;
		//扩展模式下,移动块默认为0高
		if(m_wSliderType==CN_SLIDER_TYPE_EXTEND){
			siBlockSize.cy = 0;
			m_GOBlock.SetSize(siBlockSize);
		}
	}
	m_GOBar.MoveTo(piBarPoint);

	//块按方向对齐顶点
	switch(m_wDirection){
		case CN_SLIDER_DIRECTION_LEFTRIGHT:			//从左至右
		case CN_SLIDER_DIRECTION_TOPBOTTOM:			//从上至下
			//对齐左上角
			m_GOBlock.MoveTo(m_BasalInfo.LocalPos);
			break;
		case CN_SLIDER_DIRECTION_RIGHTLEFT:			//从右至左
			{
				//对齐右上角
				_POINT	piPos = m_BasalInfo.LocalPos;
				piPos.x += (siBarSize.cx-siBlockSize.cx);

				m_GOBlock.MoveTo(piPos);
			}
			break;
		case CN_SLIDER_DIRECTION_BOTTOMTOP:			//从下至上
			{
				//对齐左下角
				_POINT	piPos = m_BasalInfo.LocalPos;
				piPos.y += (siBarSize.cy-siBlockSize.cy);

				m_GOBlock.MoveTo(piPos);
			}
			break;
	}

	//若扩展模式需设置块的纹理大小
	if(m_wSliderType==CN_SLIDER_TYPE_EXTEND){
		_RECT	rcTexture = m_GOBlock.GetTextureSize();
		rcTexture.right = rcTexture.left + siBlockSize.cx;
		rcTexture.bottom = rcTexture.top + siBlockSize.cy;
		m_GOBlock.SetTextureSize(rcTexture);
	}
}

//设置最大值
void CGameObjectSlider::SetMax(WORD wMax){
	if(m_wCurrent>wMax)
		m_wCurrent = wMax;
	m_wMax = wMax;

	CalcInterval();
}

//设置最小值
void CGameObjectSlider::SetMin(WORD wMin){
	if(m_wCurrent<wMin)
		m_wCurrent = wMin;
	m_wMin = wMin;

	CalcInterval();
}

//设置图片资源
void CGameObjectSlider::SetResource(CResource* pResource){
	m_pResource = pResource;
}

//设置滑动类型
void CGameObjectSlider::SetSliderType(WORD wType){

	m_wSliderType = wType;
}

//设置步长值
void CGameObjectSlider::SetStep(WORD wStep){
	m_wStep = wStep;
}

//************************************
// <p>Description: 接口查询</p>
// <p>Parameters:  </p>
// <p>    const IID & Guid</p>
// <p>    DWORD dwQueryVer</p>
//
// <p>Returns:   void*</p>
//************************************
void* CGameObjectSlider::QueryInterface(const IID &Guid, DWORD dwQueryVer){
	QUERYINTERFACE(IGameObjectSlider,Guid,dwQueryVer);
	QUERYINTERFACE(IGameObject,Guid,dwQueryVer);
	QUERYINTERFACE(IBaseObject,Guid,dwQueryVer);
	QUERYINTERFACE_IUNKNOWNEX(IGameObjectSlider,Guid,dwQueryVer);
	return NULL;
}

//************************************
// <p>Description: =操作重载</p>
// <p>Parameters:  </p>
// <p>    const CGameObjectText & GameObject</p>
//
// <p>Returns:   CGameObjectText&</p>
//************************************
CGameObjectSlider& CGameObjectSlider::operator=(CGameObjectSlider& GameObject){
	CGameObject*	pOtherBaseClass = static_cast<CGameObject *>(&GameObject);
	CGameObject*	pMySelfBaseClass = static_cast<CGameObject *>(this);
	*pMySelfBaseClass = *pOtherBaseClass;

	m_siInterval	= GameObject.m_siInterval;
	m_pResource		= GameObject.m_pResource;
	m_wCurrent		= GameObject.m_wCurrent;
	m_wMax			= GameObject.m_wMax;
	m_wMin			= GameObject.m_wMin;
	m_wSliderType	= GameObject.m_wSliderType;
	m_wStep			= GameObject.m_wStep;
	m_GOBar			= GameObject.m_GOBar;
	m_GOBlock		= GameObject.m_GOBlock;
	m_wDirection	= GameObject.m_wDirection;

	Add(GET_OBJECT_INTERFACE(m_GOBar, IGameObject), "Bar");
	Add(GET_OBJECT_INTERFACE(m_GOBlock, IGameObject), "Block");

	return *this;
}

//************************************
// <p>Description: 鼠标移动</p>
// <p>Parameters:  </p>
// <p>    float x</p>
// <p>    float y</p>
// <p>    int nType</p>
// <p>    int nKey</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameObjectSlider::OnMouseMove(float x, float y, UINT nComboKey){
	if(nComboKey!=0 && m_bDropping){
		_POINT piBlockPos = m_GOBlock.ScreenToLocal(_POINT(x, y));
		if(!m_GOBlock.Hitting(x,y)){
			if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT){
				if(piBlockPos.x<0)
					Increase(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT?false:true);
				else
					Increase(m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT?false:true);
			}
			else{
				if(piBlockPos.y<0)
					Increase(m_wDirection==CN_SLIDER_DIRECTION_TOPBOTTOM?false:true);
				else
					Increase(m_wDirection==CN_SLIDER_DIRECTION_BOTTOMTOP?false:true);
			}
		}
	}

	return true;
}

//************************************
// <p>Description: 鼠标点击</p>
// <p>Parameters:  </p>
// <p>    float x</p>
// <p>    float y</p>
// <p>    int nType</p>
// <p>    int nKey</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameObjectSlider::OnMouseClick(float x, float y, int nType, UINT nMessage, UINT nComboKey){
	if(nType==INPUT_MOUSE_DOWN){
		_POINT piBlockPos = m_GOBlock.ScreenToLocal(_POINT(x, y));
		if(m_wSliderType==CN_SLIDER_TYPE_NORMAL){
			if(m_GOBlock.Hitting(x,y)){
				m_bDropping = true;
			}
			else{
				if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT){
					if(piBlockPos.x<0)
						Increase(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT?false:true);
					else
						Increase(m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT?false:true);
				}
				else{
					if(piBlockPos.y<0)
						Increase(m_wDirection==CN_SLIDER_DIRECTION_TOPBOTTOM?false:true);
					else
						Increase(m_wDirection==CN_SLIDER_DIRECTION_BOTTOMTOP?false:true);
				}
			}
		}
		else{
			//根据X,Y求出当前STEP
			//求间隔宽度
			piBlockPos = ScreenToLocal(_POINT(x, y));
			WORD	wStep = 0;
			
			if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_RIGHTLEFT){
				//左右
				wStep = (WORD)(piBlockPos.x/m_siInterval.cx);
				wStep = (m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT?wStep+1:m_wMax-wStep)-m_wMin;
			}
			else{
				//上下
				wStep = (WORD)abs(piBlockPos.y/m_siInterval.cy);
				wStep = (m_wDirection==CN_SLIDER_DIRECTION_TOPBOTTOM?wStep+1:m_wMax-wStep)-m_wMin;
			}
			SetCurrent(wStep);
		}
	}
	else{
		if(nType==INPUT_MOUSE_UP && m_bDropping)
			m_bDropping = false;
	}

	return true;
}

//************************************
// <p>Description: 鼠标移出</p>
// <p>Parameters:  </p>
// <p>    float x</p>
// <p>    float y</p>
// <p>    int nType</p>
// <p>    int nKey</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameObjectSlider::OnMouseOut(float x, float y, int nType, UINT nMessage, UINT nComboKey){
	if(m_bDropping){
		m_bDropping = false;
	}

	return true;
}

//************************************
// <p>Description: 键盘事件</p>
//
// <p>Returns:   bool</p>
//************************************
bool CGameObjectSlider::OnKeyDown(TCHAR nKey, UINT nFlag){
	//只处理KEYDOWN事件
	switch(nKey){
		case VK_LEFT:		//左
		case VK_UP:		//上
			if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_TOPBOTTOM)
				Increase(false);
			else
				Increase();
			break;
		case VK_RIGHT:		//右
		case VK_DOWN:		//下
			if(m_wDirection==CN_SLIDER_DIRECTION_LEFTRIGHT || m_wDirection==CN_SLIDER_DIRECTION_TOPBOTTOM)
				Increase();
			else
				Increase(false);
			break;
	}

	return true;
}

⌨️ 快捷键说明

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