亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cbmouse.cpp

?? 赤壁之戰的游戲源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/////////////////////
//	CBDraw.cpp		:	v0021
//	Written by		:	Liu Gang
//	Compiler		:	Microsoft Visual C++ 4.2 & DirectX
//	Library			:	DDraw.Lib
//	Copyright (C)	:	1996-1997 WayAhead Corporation
//	v0021			:	Jan.22.1997, devided from CBDraw.cpp
//  v0022			:	Sep.11.1997, HitTestU() parameters changed
/////////////////////
#include "stdafx.h"
#include <stdio.h>
#include "CBMouse.h"

#include "Assert.h"
#include "DDCompo.h"
#include "CBMap.h"
#include "CBGame.h"
#include "CBDraw.h"
#include "CBCtrl.h"
#include "CBEyes.h"
#include "CBMini.h"
#include "CBShadow.h"

#include "Marco.h"

/////////////////////
// external globals
// declared in CBDraw.cpp
extern RECT DRAW_rcScreen;
extern RECT DRAW_rcClient;
extern POINT DRAW_ptScreenOffset;
extern POINT DRAW_ptCovering[2][9];
/////////////////////

// private globals,for mouse control
/////////////////////
// array used for detecting if mouse hit the region
// 探測鼠標點擊
int nByConts[MAP_ITEM_WIDTH][MAP_ITEM_HEIGHT];
/////////////////////

/////////////////////
// state of the cursor, 但是不一定與pCursor的狀態一樣
int MOUSE_nState = MOUSE_STATE_NONE;
/////////////////////

/////////////////////
// local functions
BOOL MOUSE_bEnableTest=TRUE;
void MOUSE_testState( int nPosX, int nPosY );
/////////////////////

/////////////////////
// 初始化探測用數據
extern CDDPalette palMain;
void MOUSE_InitByConts()
{
//為數組nByConts[MAP_ITEM_WIDTH][MAP_ITEM_HEIGHT]賦值
	memset( nByConts, 0, MAP_ITEM_WIDTH*MAP_ITEM_HEIGHT );
	int halfwidth = MAP_ITEM_WIDTH>>1;
	int jj;
	for(int j=0; j<(MAP_ITEM_HEIGHT>>1); j++ ) 
	{
		jj = (j+1)<<1;
		for(int i=halfwidth-jj; i<halfwidth+jj; i++ )
		{
			nByConts[i][j]=1;
			nByConts[i][MAP_ITEM_HEIGHT-j-2]=1;
		}
	}
}
/////////////////////

/////////////////////
// 檢驗鼠標點擊的效果
// pt		:	鼠標點擊的坐標,直接從GetCursorPos()中的得到的,以點為單位。
// 返回格子(行、列)
inline POINT MOUSE_hitTestPoint( POINT pt )
{
	POINT ptReturn;
	POINT ptGrid[3], ptOff[3];
	SIZE szItem;

	// initialize
	szItem.cx = MAP_Lib.szItem.cx, szItem.cy = MAP_Lib.szItem.cy;
	ptReturn.x = ptReturn.y = -1;

//	OutputString( pt.x, "," );
//	OutputString( pt.y, "\n" );

	// get grids position
	int halfy = szItem.cy>>1;
	int halfx = szItem.cx>>1;
	ptGrid[0].y = pt.y/(halfy);
	ptGrid[1].y = ptGrid[0].y-1;
	ptGrid[2].y = ptGrid[0].y-1;
	ptOff[0].y = pt.y - ptGrid[0].y*(halfy);
	ptOff[1].y = ptOff[0].y + halfy;
	ptOff[2].y = ptOff[0].y + halfy;
	int bOdd = ptGrid[0].y&1;
	int bEven = 1 - bOdd;
	ptGrid[0].x = (pt.x - halfx*bOdd) / szItem.cx;
	ptGrid[1].x = ptGrid[0].x + bOdd - 1; 
	ptGrid[2].x = ptGrid[0].x + bOdd;
	ptOff[0].x = pt.x - ptGrid[0].x*szItem.cx - halfx*bOdd;
	ptOff[1].x = pt.x - ptGrid[1].x*szItem.cx - halfx*bEven;
	ptOff[2].x = pt.x - ptGrid[2].x*szItem.cx - halfx*bEven;

	// check
	for( int i=0; i<3; i++ )
	{
		if( ptOff[i].x >= 0 && ptOff[i].y >= 0 &&
			ptOff[i].x < szItem.cx && ptOff[i].y < szItem.cy )
		{
			// test if in the points
			if( nByConts[ptOff[i].x][ptOff[i].y] == 1 )
			{
				// global position
//				ptReturn.x = DRAW_rcScreen.left + ptGrid[i].x + DRAW_SCREEN_ADJUST;
//				ptReturn.y = DRAW_rcScreen.top + ptGrid[i].y;
				ptReturn.x = ptGrid[i].x;// + DRAW_SCREEN_ADJUST;
				ptReturn.y = ptGrid[i].y;
				return ptReturn;
			}
		}
	}

	// set coords
	return ptReturn;
}

// 檢測單元
// pt			:	鼠標點擊的坐標,直接從GetCursorPos()中的得到的,以點為單位。
// pHitResult	:	檢測的結果
// bEnemy		:	只選擇敵人時為真
// 返回FALSE時pHitResult無效
BOOL MOUSE_HitTestU( POINT pt, struct MOUSE_HITRESULT_STRUCT *pHitResult, BOOL bEnemy/*=0*/ )
{
	POINT point, ptGrid;

	ptGrid.x = -1, ptGrid.y = -1;
	pHitResult->nType = MOUSE_HITRESULT_NONE;	// initialize

	pt.x += DRAW_ptScreenOffset.x, pt.y += DRAW_ptScreenOffset.y;
	ptGrid = MOUSE_hitTestPoint( pt );
	if( ptGrid.x == -1 || ptGrid.y == -1 )	return FALSE;
	Assert( ptGrid.x != -1 && ptGrid.y != -1 );
	pt.x -= DRAW_ptScreenOffset.x, pt.y -= DRAW_ptScreenOffset.y;

	// get display data
	point.x = ptGrid.x, point.y = ptGrid.y;
	WORD codeUEx = MAP_GetUnitDataEx( point.x, point.y );
	if( codeUEx != MAP_DATA_NONE )
	{
		struct UNIT_STRUCT * pUnit = MAP_GetUnit( codeUEx );
		// reset position
		point.x = pUnit->Draw.nX, point.y = pUnit->Draw.nY;

		// Please note:
		RECT rect = MAP_GetUnitRect( DRAW_ptScreenOffset, &pUnit->Draw );
		if( rect.left < pt.x && rect.right >= pt.x &&
			rect.top < pt.y && rect.bottom >= pt.y )
		{
			// 如果該單元已經死亡,則不算
			// 如果該單元不是敵人,而且bEnemy是TRUE,則不算, Sep.11.1997
			struct UNIT_STRUCT *pUnit = MAP_GetUnit( codeUEx );
			Assert( pUnit );
			if( !EYE_IfUnitIsDead( pUnit ) 
				&& !( bEnemy == TRUE && pUnit->Draw.nPlayer == GAME.nMe ) )
			{
				BOOL bSet = TRUE;
				if( SHADOW_IfEnabled() )
				{
					WORD codeR = MAP_GetRegionData( point.x, point.y );
					struct MAP_REGION_CODE_STRUCT stctR;
					MAP_RegionDeCode( codeR, &stctR );
					if( stctR.nShadow == MAP_SHADOW_NONE || stctR.nShadowEx == 1 )
					{// 有任何形式的陰影,不響應
						bSet = FALSE;
					}
					if( pUnit->Draw.nPlayer == 0 )
					{// 是資源,可以響應
						bSet = TRUE;
					}
				}
				if( bSet == TRUE )
				{
					pHitResult->nType = MOUSE_HITRESULT_UNIT;	
					pHitResult->nLayer = pUnit->Draw.nLayer;
					Assert( pHitResult->nLayer < 3 );
					pHitResult->wCode = codeUEx;
					pHitResult->ptHit.x = point.x;
					pHitResult->ptHit.y = point.y;
					return TRUE;
				}
			}
		}
	}

	for( int y=4; y>=0; y-- )
	for( int x=0; x<9; x++ )
	{
		// calc next position
		int bOdd = pt.y&1;
		point.x = ptGrid.x+DRAW_ptCovering[bOdd][x].x;
		point.y = ptGrid.y+DRAW_ptCovering[bOdd][x].y+y*2;
		if( EYE_IfOutOfRange( point.x, point.y ) )
			continue;

		// get display data
		WORD codeUEx = MAP_GetUnitDataEx( point.x, point.y );
		if( codeUEx != MAP_DATA_NONE )
		{
			struct UNIT_STRUCT * pUnit = MAP_GetUnit( codeUEx );
			// reset position
			point.x = pUnit->Draw.nX, point.y = pUnit->Draw.nY;
			RECT rect = MAP_GetUnitRect( DRAW_ptScreenOffset, &pUnit->Draw );
			if( rect.left < pt.x && rect.right >= pt.x &&
				rect.top < pt.y && rect.bottom >= pt.y )
			{
				// 如果該單元已經死亡,則不算
				// 如果該單元不是敵人,而且bEnemy是TRUE,則不算, Sep.11.1997
				struct UNIT_STRUCT *pUnit = MAP_GetUnit( codeUEx );
				Assert( pUnit );
				if( !EYE_IfUnitIsDead( pUnit ) 
					&& !( bEnemy == TRUE && pUnit->Draw.nPlayer == GAME.nMe ) )
				{
					BOOL bSet = TRUE;

					if( SHADOW_IfEnabled() )
					{
						WORD codeR = MAP_GetRegionData( point.x, point.y );
						struct MAP_REGION_CODE_STRUCT stctR;
						MAP_RegionDeCode( codeR, &stctR );
						if( stctR.nShadow == MAP_SHADOW_NONE || stctR.nShadowEx == 1 )
						{
							bSet = FALSE;
						}
					}
					if( bSet == TRUE )
					{
						pHitResult->nType = MOUSE_HITRESULT_UNIT;
						pHitResult->nLayer = pUnit->Draw.nLayer;
						pHitResult->wCode = codeUEx;
						pHitResult->ptHit.x = point.x;
						pHitResult->ptHit.y = point.y;

						return TRUE;
					}
				}
			}
		}
	}

	// else return false
//	OutputDebugString( "HitTestU: Not Detected!\n" );
	return FALSE;
}

// 檢測地形
// pt			:	鼠標點擊的坐標,直接從GetCursorPos()中的得到的,以點為單位。
// pHitResult	:	檢測的結果
// nLayer		:	檢測的層數,缺省值為2,所有三層的地形都要檢測
// 返回FALSE時pHitResult無效
BOOL MOUSE_HitTestG( POINT pt, struct MOUSE_HITRESULT_STRUCT *pHitResult, int nLayer/* = 2*/ )
{
	POINT ptGrid;
	POINT point;
	WORD codeG;

	// initialize
	ptGrid.x = -1, ptGrid.y = -1;
	pHitResult->nType = MOUSE_HITRESULT_NONE;

	pt.x += DRAW_ptScreenOffset.x, pt.y += DRAW_ptScreenOffset.y;
	point.x = pt.x;
	for( int i=nLayer; i>=0 ; i-- )
	{
		point.y = pt.y+MAP_Lib.nHeight[i+1];
		ptGrid = MOUSE_hitTestPoint( point );
		// hit point test
		if( ptGrid.x == -1 || ptGrid.y == -1 )	return FALSE;	// not hit any point

		codeG = MAP_GetGroundData( i, ptGrid.x, ptGrid.y );
		if( codeG != MAP_DATA_NONE )
		{
			pHitResult->nType = MOUSE_HITRESULT_GROUND;	
			pHitResult->nLayer = i;
			Assert( i < 3 );
			pHitResult->wCode = codeG;
			pHitResult->ptHit.x = ptGrid.x;
			pHitResult->ptHit.y = ptGrid.y;
			return TRUE;
		}
	}
	// else return false
//	OutputDebugString( "HitTestG: Not Detected!\n" );
	return FALSE;
}

// 先檢測地形后檢測單元
// pt			:	鼠標點擊的坐標,直接從GetCursorPos()中的得到的,以點為單位。
// pHitResult	:	檢測的結果
// 返回FALSE時pHitResult無效
BOOL MOUSE_HitTestGU( POINT pt, struct MOUSE_HITRESULT_STRUCT *pHitResult )
{
	if( !MOUSE_HitTestG( pt, pHitResult ) )
	{
		return MOUSE_HitTestU( pt, pHitResult );
	}
	return TRUE;
}

// 先檢測單元后檢測地形
// pt			:	鼠標點擊的坐標,直接從GetCursorPos()中的得到的,以點為單位。
// pHitResult	:	檢測的結果
// bEnemy		:	只選擇敵人時為真
// 返回FALSE時pHitResult無效
BOOL MOUSE_HitTestUG( POINT pt, struct MOUSE_HITRESULT_STRUCT *pHitResult, BOOL bEnemy /*=0*/ )
{
	if( !MOUSE_HitTestU( pt, pHitResult, bEnemy ) )
	{
		return MOUSE_HitTestG( pt, pHitResult );
	}
	return TRUE;
}
/////////////////////

/////////////////////
// test mouse dragging

// globals
// synchronization for drag and draw
BOOL MOUSE_bSemaphore = FALSE;

// if left mouse button is down
BOOL MOUSE_bLeftDown = FALSE;
BOOL MOUSE_bLeftDownLast = FALSE;

/*
// if right mouse button is down
BOOL MOUSE_bRightDown = FALSE;
BOOL MOUSE_bRightDownLast = FALSE;
*/

// dragging rectangle, and the old one
RECT MOUSE_rcDrag, MOUSE_rcDragLast;

// the first point mouse button down
POINT MOUSE_ptFirst;

// save the origional mouse moving range
RECT rcOldRange;

// if mouse left button down, set down flag, begin dragging process
// nPosX, nPosY	:	mouse cursor position
void MOUSE_LeftDown( int nPosX, int nPosY )
{
	// clear semaphore flag
	MOUSE_bSemaphore = FALSE;

	// set the flag
	if( MOUSE_bLeftDown == TRUE )
		return;
	MOUSE_bLeftDown = TRUE;
	MOUSE_bLeftDownLast = TRUE;

	// set value to MOUSE_rcDrag
	SetRect( &MOUSE_rcDrag, nPosX, nPosY, nPosX, nPosY );
	SetRect( &MOUSE_rcDragLast, nPosX, nPosY, nPosX, nPosY );
	MOUSE_ptFirst.x = nPosX, MOUSE_ptFirst.y = nPosY;

	// set mouse cursor new range
	class CDDCursor *pCursor;
	pCursor = CURSOR_Get();
	Assert( pCursor!= NULL );
	rcOldRange = pCursor->SetRange( &DRAW_rcClient );
	Assert( rcOldRange.left == 0 && rcOldRange.top == 0 );

	// change cursor state
	MOUSE_testState( nPosX, nPosY );
}

// if mouse left button up, clear down flag, end dragging process
// nPosX, nPosY	:	mouse cursor position
// return		:	dragging rectangle

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
...xxx性欧美| 中文字幕免费不卡| jizzjizzjizz欧美| 五月激情综合婷婷| 国产丝袜美腿一区二区三区| 欧洲一区二区三区免费视频| 久久精品国产在热久久| 亚洲婷婷在线视频| 久久久久国产精品人| 欧美日韩国产乱码电影| av电影天堂一区二区在线| 免费观看30秒视频久久| 亚洲综合一区二区三区| 欧美国产日产图区| 久久精品夜色噜噜亚洲aⅴ| 欧美男人的天堂一二区| 一本一道波多野结衣一区二区| 激情六月婷婷久久| 青青草国产成人99久久| 亚洲国产美国国产综合一区二区 | 精品成人一区二区三区四区| 欧美中文字幕一二三区视频| 成人黄色电影在线 | 麻豆91在线看| 亚洲国产aⅴ成人精品无吗| 国产精品福利一区| 中文字幕精品在线不卡| 久久综合久久综合久久综合| 日韩亚洲欧美高清| 67194成人在线观看| 欧美日韩一区二区三区视频| 欧美亚洲一区二区三区四区| 一本一道综合狠狠老| 99国产精品久| 91色在线porny| 一本到三区不卡视频| 91丨porny丨中文| 91丨porny丨在线| 色综合婷婷久久| 91麻豆精东视频| 色综合久久99| 欧美亚洲丝袜传媒另类| 欧美日韩视频第一区| 欧美三日本三级三级在线播放| 色综合久久六月婷婷中文字幕| 91麻豆精东视频| 欧美日免费三级在线| 欧美日韩一区二区三区免费看| 欧美欧美欧美欧美首页| 日韩欧美在线影院| 精品国产百合女同互慰| 2欧美一区二区三区在线观看视频| 欧美精品一区二区三区高清aⅴ| 日韩精品一区二| 国产欧美日韩麻豆91| 国产精品进线69影院| 国产精品久久99| 亚洲综合在线观看视频| 日韩在线卡一卡二| 激情久久五月天| 99精品国产视频| 欧洲国内综合视频| 欧美妇女性影城| 精品精品欲导航| 国产精品美女久久久久久久久久久 | 人禽交欧美网站| 精品一区二区三区在线视频| 国产98色在线|日韩| 色婷婷综合久久久久中文| 欧美精品视频www在线观看| 日韩网站在线看片你懂的| 久久久精品国产免大香伊| 久久精品国产色蜜蜜麻豆| 色香色香欲天天天影视综合网| 91国在线观看| 久久精品网站免费观看| 日韩精品免费视频人成| 亚洲另类在线视频| 粉嫩绯色av一区二区在线观看| 久久99日本精品| 五月婷婷综合激情| 国产精品一区二区视频| 极品少妇一区二区| 成人黄页毛片网站| 欧美日本一区二区三区四区| 日韩三级视频在线观看| 国产日韩欧美一区二区三区乱码| 亚洲男同性恋视频| 国模一区二区三区白浆| 色哟哟一区二区三区| 欧美成人午夜电影| 亚洲狠狠丁香婷婷综合久久久| 日本sm残虐另类| 91丨九色丨尤物| 精品88久久久久88久久久| 亚洲美女区一区| 国产精品中文有码| 欧美高清视频一二三区| 亚洲色图欧美激情| 韩国v欧美v日本v亚洲v| 欧美天堂一区二区三区| 欧美激情一区在线| 欧美a级一区二区| 色综合亚洲欧洲| 中文字幕欧美日韩一区| 美女mm1313爽爽久久久蜜臀| 色猫猫国产区一区二在线视频| 久久久国产一区二区三区四区小说 | 国产一二三精品| 欧美色区777第一页| 国产精品久久久久久久久免费相片| 美女任你摸久久| 欧美日韩久久一区| 亚洲激情第一区| 成人夜色视频网站在线观看| 欧美成人精品1314www| 亚洲国产美国国产综合一区二区| 91一区在线观看| 国产精品国产精品国产专区不蜜| 国产精品一级片在线观看| 日韩三级视频中文字幕| 国产精品白丝jk黑袜喷水| 91精品国产aⅴ一区二区| 亚洲黄色av一区| 色偷偷一区二区三区| 亚洲欧洲日韩一区二区三区| 国产精品亚洲成人| 精品电影一区二区三区 | 97久久超碰国产精品| 日本一区二区三区在线不卡| 国内精品不卡在线| 欧美sm美女调教| 国产精品自拍网站| 国产亚洲精品资源在线26u| 国精产品一区一区三区mba桃花| 4438x成人网最大色成网站| 婷婷激情综合网| 欧美顶级少妇做爰| 日本中文字幕一区二区视频| 在线综合+亚洲+欧美中文字幕| 亚洲成人精品一区| 欧美日韩午夜在线| 视频一区二区国产| 日韩亚洲欧美综合| 久久国产尿小便嘘嘘| 久久亚洲免费视频| 粉嫩高潮美女一区二区三区| 国产精品久久99| 在线观看一区日韩| 午夜欧美视频在线观看| 欧美精品1区2区3区| 奇米影视一区二区三区| 日韩视频免费观看高清在线视频| 久久精品99国产精品日本| 久久综合久久综合久久| 国产99久久久国产精品| 亚洲品质自拍视频| 在线成人小视频| 全国精品久久少妇| 国产亚洲美州欧州综合国| 99久久国产免费看| 午夜欧美在线一二页| 精品久久五月天| 成人精品视频一区二区三区尤物| 亚洲男人都懂的| 欧美肥胖老妇做爰| 国精品**一区二区三区在线蜜桃| 国产女人aaa级久久久级| 色综合欧美在线视频区| 秋霞午夜鲁丝一区二区老狼| 久久夜色精品国产欧美乱极品| 成人高清视频在线观看| 午夜精品久久久久久久久| 精品国产免费一区二区三区香蕉| 成人免费视频免费观看| 亚洲妇熟xx妇色黄| 久久久美女艺术照精彩视频福利播放| 成人精品国产一区二区4080| 亚洲国产欧美日韩另类综合| 欧美精品一区二区久久久| 日本高清不卡aⅴ免费网站| 免费观看在线综合| 国产精品美女久久久久久久网站| 欧美美女直播网站| 大白屁股一区二区视频| 五月天中文字幕一区二区| 国产视频一区不卡| 欧美高清性hdvideosex| 成人精品鲁一区一区二区| 丝袜亚洲另类丝袜在线| 中文字幕巨乱亚洲| 欧美一级高清大全免费观看| 99麻豆久久久国产精品免费优播| 日本成人在线一区| 亚洲女子a中天字幕| 久久综合资源网| 欧美日韩日日夜夜| 91视视频在线观看入口直接观看www | 精品一区二区免费看| 一级做a爱片久久|