예제 #1
0
//--------------------------------------------------------------------------
//	功能:放置物品
//--------------------------------------------------------------------------
int KWndObjectMatrix::DropObject(int x, int y, bool bTestOnly)
{
	KUiDraggedObject	DragObj;

	m_nPutPosX = NO_MATCHED_PUT_POS;
	if (m_Style & OBJCONT_S_ACCEPT_FREE)
	{
		if (bTestOnly == false)
			DropObject(x, y, (KUiDraggedObject*)NULL);
		return true;
	}

	Wnd_GetDragObj(&DragObj);
	if (DragObj.DataW > m_nNumUnitHori || DragObj.DataH > m_nNUmUnitVert)
		return false;

	//转换成格子坐标
	RECT	or;
	KUiDraggedObject* pOverlaped = NULL;

	x = (x - m_nAbsoluteLeft) / m_nUnitWidth;
	y = (y - m_nAbsoluteTop) / m_nUnitHeight;
	if ((or.right = x + (DragObj.DataW + 1) / 2) > m_nNumUnitHori)
		or.right = m_nNumUnitHori;
	if ((or.bottom = y + (DragObj.DataH + 1) / 2) > m_nNUmUnitVert)
		or.bottom = m_nNUmUnitVert;
	if (or.right >= DragObj.DataW)
		or.left = or.right - DragObj.DataW;
	else
	{
		or.left = 0;
		or.right = DragObj.DataW;
	}
	if (or.bottom >= DragObj.DataH)
		or.top = or.bottom - DragObj.DataH;
	else
	{
		or.top = 0;
		or.bottom = DragObj.DataH;
	}

	if (TryDropObjAtPos(or, pOverlaped))
	{
		if (bTestOnly == false)
			DropObject(or.left, or.top, pOverlaped);
		else if (pOverlaped)
		{
			m_nPutPosX = REPLACE_ITEM_POS(pOverlaped - m_pObjects);
		}
		else
		{
			m_nPutPosX = or.left;
			m_nPutPosY = or.top;
			m_nPutWidth = DragObj.DataW;
			m_nPutHeight = DragObj.DataH;
		}
		return true;
	}

	if (DragObj.DataW == 1 && DragObj.DataH == 1)
		return false;

	RECT	Try;
	Try.right = x;
	Try.bottom = y;
	if ((Try.left = x - DragObj.DataW + 1) < 0)
		Try.left = 0;
	if ((Try.top = y - DragObj.DataH + 1) < 0)
		Try.top = 0;

	for (or.left = Try.left; or.left <= Try.right; or.left ++)
	{
		or.right = or.left + DragObj.DataW;
		for (or.top = Try.top; or.top <= Try.bottom; or.top ++)
		{
			or.bottom = or.top + DragObj.DataH;
			if (TryDropObjAtPos(or, pOverlaped))
			{
				if (bTestOnly == false)
					DropObject(or.left, or.top, pOverlaped);
				return true;
			}
		}
	}
	return false;
}
예제 #2
0
//--------------------------------------------------------------------------
//	功能:窗口函数
//--------------------------------------------------------------------------
int KWndObjectBox::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
{
	int nStallState = g_pCoreShell->GetGameData(GDI_IS_STALL, -1, -1);
	switch(uMsg)
	{
	case WM_LBUTTONDOWN:
		if (m_pParentWnd && !nStallState &&
			(m_Style & OBJCONT_S_DISABLE_PICKPUT) == 0)
		{
			if (Wnd_GetDragObj(NULL))
			{
				DropObject(false);
			}
			else if (m_Object.uGenre != CGOG_NOTHING)
			{
				ITEM_PICKDROP_PLACE	Pick;
				Pick.pWnd = this;
				Pick.h = 0;
				Pick.v = 0;
				m_pParentWnd->WndProc(WND_N_ITEM_PICKDROP,
					(unsigned int)&Pick, NULL);
			}
		}
		break;
	case WM_LBUTTONUP:
		if (m_pParentWnd && ((m_Style & OBJCONT_S_DISABLE_PICKPUT) || nStallState))
		{
			if (m_Object.uGenre != CGOG_NOTHING)
			{
				KUiDraggedObject	Obj;
				Obj = m_Object;
				m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM,
					(unsigned int)&Obj, (int)(KWndWindow*)this);
			}
			else if (m_Style & OBJCONT_S_ENABLE_CLICK_EMPTY)
			{
				m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM,
					NULL, (int)(KWndWindow*)this);
			}
		}
		break;
	case WM_RBUTTONUP:
		if (m_pParentWnd)
		{
			if (m_Object.uGenre != CGOG_NOTHING)
			{
				KUiDraggedObject	Obj;
				Obj = m_Object;
				m_pParentWnd->WndProc(WND_N_RIGHT_CLICK_ITEM,
					(unsigned int)&m_Object, (int)(KWndWindow*)this);
			}
			else if (m_Style & OBJCONT_S_ENABLE_CLICK_EMPTY)
			{
				m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM,
					NULL, (int)(KWndWindow*)this);
			}
		}
		break;
	case WM_MOUSEHOVER:
	case WM_MOUSEMOVE:
		m_Style |= OBJCONT_F_MOUSE_HOVER;
		if (m_Object.uGenre != CGOG_NOTHING && g_MouseOver.IsMoseHoverWndObj(this, 0) == 0)
			SetMouseHoverObjectDesc(this, 0, m_Object.uGenre,
				m_Object.uId, m_nContainerId, GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam));
		break;
	case WND_M_MOUSE_LEAVE:
		m_Style &= ~OBJCONT_F_MOUSE_HOVER;
		KWndWindow::WndProc(uMsg, uParam, nParam);
		break;
	default:
		return KWndWindow::WndProc(uMsg, uParam, nParam);
	}
	return 0;
}
예제 #3
0
//--------------------------------------------------------------------------
//	功能:窗口函数
//--------------------------------------------------------------------------
int KWndObjectMatrix::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
{
	int nStallState = g_pCoreShell->GetGameData(GDI_IS_STALL, -1, -1);
	switch(uMsg)
	{
	case WM_LBUTTONDOWN:
		if (!nStallState && (m_Style & OBJCONT_S_DISABLE_PICKPUT)== 0)
		{
			if (Wnd_GetDragObj(NULL))
				DropObject(GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam), false);
			else
				PickUpObjectAt(GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam));
		}
		break;
	case WM_LBUTTONUP:
		if ((nStallState || (m_Style & OBJCONT_S_DISABLE_PICKPUT)) && m_pParentWnd)
		{
			m_nPutPosX = NO_MATCHED_PUT_POS;
			int nObj = GetObjectAt(GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam));
			if (nObj >= 0)
			{
				KUiDraggedObject	Obj;
				Obj = m_pObjects[nObj];
				m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM,
					(unsigned int)&Obj, (int)(KWndWindow*)this);
			}
		}
		break;
	case WM_RBUTTONUP:
		m_nPutPosX = NO_MATCHED_PUT_POS;
		if (m_pParentWnd)
		{
			int nObj = GetObjectAt(GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam));
			if (nObj >= 0)
			{
				KUiDraggedObject	Obj;
				Obj = m_pObjects[nObj];
				m_pParentWnd->WndProc(WND_N_RIGHT_CLICK_ITEM,
					(unsigned int)&Obj, (int)(KWndWindow*)this);
			}
		}
		break;
	case WM_MOUSEHOVER:
	case WM_MOUSEMOVE:
		m_Style |= OBJCONT_F_MOUSE_HOVER;
		{
			int	x = GET_X_LPARAM(nParam);
			int y = GET_Y_LPARAM(nParam);
			int nObj = GetObjectAt(x, y);
			m_nMouseOverObj = nObj;
			if (nObj >= 0)
			{
				if (g_MouseOver.IsMoseHoverWndObj(this, nObj) == 0)
				{
					SetMouseHoverObjectDesc(this, nObj, m_pObjects[nObj].uGenre,
						m_pObjects[nObj].uId, m_nContainerId, x, y);
				}
			}
			else
				g_MouseOver.CancelMouseHoverInfo();
			if ((m_Style & OBJCONT_S_TRACE_PUT_POS) && Wnd_GetDragObj(NULL))
			{
				DropObject(GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam), true);
			}
		}
		break;
	case WND_M_MOUSE_LEAVE:
		m_nPutPosX = NO_MATCHED_PUT_POS;
		m_Style &= ~OBJCONT_F_MOUSE_HOVER;
		KWndWindow::WndProc(uMsg, uParam, nParam);
		break;
	default:
		return KWndWindow::WndProc(uMsg, uParam, nParam);
	}
	return 0;
}
예제 #4
0
		/*=============================================================================
		-- Drops the active object.
		=============================================================================*/
		void Actor::DropActiveObject()
		{
			if (!mInventory->GetActiveObject().expired())
				DropObject(mInventory->GetActiveObject().lock()->GetId());
		}