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

📄 taiqiudlg.cpp

📁 为联众台球游戏开发
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		int nPos=41;//目标球在内存位图中的位置
		int nj;
		pDC=GetDC();
		pMemDC=new CDC;
		pBmp=new CBitmap;
		pMemDC->CreateCompatibleDC(pScreenDC);
		pBmp->CreateCompatibleBitmap(pScreenDC, 82, 82);//创建一个82x82的屏幕位图
		pOldBmp=pMemDC->SelectObject(pBmp);
	
		//把目标球为中心的82x82位图选入内存
		pMemDC->BitBlt(0, 0, 82, 82, pScreenDC, m_ptObjectBall.x-nPos, m_ptObjectBall.y-nPos, SRCCOPY);
 
		pOldPen=(CPen *)pMemDC->SelectStockObject(WHITE_PEN);
		//pMemDC->SetPixel(nPos, nPos, RGB(255, 255, 255));
		CDashLine line01(pMemDC, pattern, sizeof(pattern)/sizeof(unsigned));
		//上左洞垂线
		line01.MoveTo(m_ptVerLine[0][0].x+nPos, m_ptVerLine[0][0].y+nPos);
		line01.LineTo(m_ptCueBallPos[0].x+nPos, m_ptCueBallPos[0].y+nPos);
		line01.LineTo(m_ptVerLine[0][1].x+nPos, m_ptVerLine[0][1].y+nPos);
		//上中洞垂线
		line01.MoveTo(m_ptVerLine[1][0].x+nPos, m_ptVerLine[1][0].y+nPos);
		line01.LineTo(m_ptCueBallPos[1].x+nPos, m_ptCueBallPos[1].y+nPos);
		line01.LineTo(m_ptVerLine[1][1].x+nPos, m_ptVerLine[1][1].y+nPos);
		//上右洞垂线
		line01.MoveTo(m_ptVerLine[2][0].x+nPos, m_ptVerLine[2][0].y+nPos);
		line01.LineTo(m_ptCueBallPos[2].x+nPos, m_ptCueBallPos[2].y+nPos);
		line01.LineTo(m_ptVerLine[2][1].x+nPos, m_ptVerLine[2][1].y+nPos);
		//下左洞垂线
		line01.MoveTo(m_ptVerLine[3][0].x+nPos, m_ptVerLine[3][0].y+nPos);
		line01.LineTo(m_ptCueBallPos[3].x+nPos, m_ptCueBallPos[3].y+nPos);
		line01.LineTo(m_ptVerLine[3][1].x+nPos, m_ptVerLine[3][1].y+nPos);
		//下中洞垂线
		line01.MoveTo(m_ptVerLine[4][0].x+nPos, m_ptVerLine[4][0].y+nPos);
		line01.LineTo(m_ptCueBallPos[4].x+nPos, m_ptCueBallPos[4].y+nPos);
		line01.LineTo(m_ptVerLine[4][1].x+nPos, m_ptVerLine[4][1].y+nPos);
		//下右洞垂线
		line01.MoveTo(m_ptVerLine[5][0].x+nPos, m_ptVerLine[5][0].y+nPos);
		line01.LineTo(m_ptCueBallPos[5].x+nPos, m_ptCueBallPos[5].y+nPos);
		line01.LineTo(m_ptVerLine[5][1].x+nPos, m_ptVerLine[5][1].y+nPos);

		pMemDC->SelectObject(&pen);
		int nx, ny;
		for(nj=0; nj<6; nj++)
		{
			//对击球点坐标在内存位图中修正
			nx=m_ptCueBallPos[nj].x+nPos;
			ny=m_ptCueBallPos[nj].y+nPos;
			//画出目标球心到击球点的连线
			pMemDC->MoveTo(41, 41);
			pMemDC->LineTo(nx, ny);
		}
		//画出击球点圆
		pOldBrush=(CBrush *)pMemDC->SelectStockObject(NULL_BRUSH);
		pMemDC->Ellipse(23, 23, 59, 59);

		//击球点
		pMemDC->SetPixel(m_ptCueBallPos[0].x+nPos, m_ptCueBallPos[0].y+nPos, RGB(255, 0, 0)); 
		pMemDC->SetPixel(m_ptCueBallPos[1].x+nPos, m_ptCueBallPos[1].y+nPos, RGB(255, 0, 0)); 
		pMemDC->SetPixel(m_ptCueBallPos[2].x+nPos, m_ptCueBallPos[2].y+nPos, RGB(255, 0, 0)); 
		pMemDC->SetPixel(m_ptCueBallPos[3].x+nPos, m_ptCueBallPos[3].y+nPos, RGB(255, 0, 0)); 
		pMemDC->SetPixel(m_ptCueBallPos[4].x+nPos, m_ptCueBallPos[4].y+nPos, RGB(255, 0, 0)); 
		pMemDC->SetPixel(m_ptCueBallPos[5].x+nPos, m_ptCueBallPos[5].y+nPos, RGB(255, 0, 0));
		//显示出来
		pScreenDC->BitBlt(m_ptObjectBall.x-nPos, m_ptObjectBall.y-nPos, 82, 82, pMemDC, 0, 0, SRCCOPY);

		pMemDC->SelectObject(pOldBmp);
		pMemDC->SelectObject(pOldBrush);		
		pMemDC->SelectObject(pOldPen);
		ReleaseDC(pDC);	
		delete pMemDC;
		delete pBmp;
		pMemDC=NULL;
		pBmp=NULL;
		}
		break;
	}
	::DeleteDC(hScreenDC);
	CDialog::OnTimer(nIDEvent);
}

void CTaiQiuDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	KillTimer(m_nTimer);
	delete m_pBmp;
	m_pBmp=NULL;
	UnregisterHotKey(this->m_hWnd, MYHOTKEY);
	UnregisterHotKey(this->m_hWnd, MYHOTKEY01);
	if(!m_pFloatThread)
	{
		m_pFloatThread->PostThreadMessage(WM_QUIT, NULL, NULL);
	}

	CDialog::OnClose();
}

LRESULT CTaiQiuDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
{
	if(!m_bMinimize)//如果不是最小化状态
	{
	CDC * pDC;
	CDC * pMemDC;
	CBitmap * pOldBmp;
//	CBrush * pOldBrush;
	HDC hScreenDC=::GetDC(NULL);
	CDC * pScreenDC=CDC::FromHandle(hScreenDC);
	POINT pt;
	double dDst[6];
	double dAlfa[6][2];
	int nLine=1116;//18*62
//	double dLine01;
	//double dDist;	
	int nBall=18;//球直径
	int nVerLine=36;//垂线长度
	
	switch(wParam)
	{
	case MYHOTKEY://定位目标球
		if(m_strStatus!="F2定位台桌(已定位)") 
		{
			MessageBox("请先按F2键定位台桌!", "Information", MB_OK);
		}
		else
		{
			m_bPaint^=TRUE;//显示击球点
			if(m_bPaint)
			{
				GetCursorPos(&pt);
				//目标球球心坐标
				pt.x=pt.x+10;
				pt.y=pt.y-10;
				pDC=GetDC();
				pMemDC=new CDC;
				pMemDC->CreateCompatibleDC(pDC);
				pOldBmp=pMemDC->SelectObject(m_pBmp);
				//把窗口Img01的图像拷入位图m_pBmp中
				pMemDC->BitBlt(0, 0, 79, 79, pDC, m_rctImg01.left, m_rctImg01.top, SRCCOPY);
			
			//计算目标球与6个球洞的距离
				dDst[0]=sqrt(pow((pt.x-m_ptBallHoleTopLeft.x), 2)+pow((pt.y-m_ptBallHoleTopLeft.y), 2));
				dDst[1]=sqrt(pow((pt.x-m_ptBallHoleTopMiddle.x), 2)+pow((pt.y-m_ptBallHoleTopMiddle.y), 2));
				dDst[2]=sqrt(pow((pt.x-m_ptBallHoleTopRight.x), 2)+pow((pt.y-m_ptBallHoleTopRight.y), 2));
				dDst[3]=sqrt(pow((pt.x-m_ptBallHoleBottomLeft.x), 2)+pow((pt.y-m_ptBallHoleBottomLeft.y), 2));
				dDst[4]=sqrt(pow((pt.x-m_ptBallHoleBottomMiddle.x), 2)+pow((pt.y-m_ptBallHoleBottomMiddle.y), 2));
				dDst[5]=sqrt(pow((pt.x-m_ptBallHoleBottomRight.x), 2)+pow((pt.y-m_ptBallHoleBottomRight.y), 2));

			//计算新母球的位置
				dAlfa[0][0]=((double)(pt.x-m_ptBallHoleTopLeft.x))/dDst[0];
				dAlfa[0][1]=((double)(pt.y-m_ptBallHoleTopLeft.y))/dDst[0];
				dAlfa[1][0]=((double)(pt.x-m_ptBallHoleTopMiddle.x))/dDst[1];
				dAlfa[1][1]=((double)(pt.y-m_ptBallHoleTopMiddle.y))/dDst[1];
				dAlfa[2][0]=((double)(pt.x-m_ptBallHoleTopRight.x))/dDst[2];
				dAlfa[2][1]=((double)(pt.y-m_ptBallHoleTopRight.y))/dDst[2];
				dAlfa[3][0]=((double)(pt.x-m_ptBallHoleBottomLeft.x))/dDst[3];
				dAlfa[3][1]=((double)(pt.y-m_ptBallHoleBottomLeft.y))/dDst[3];
				dAlfa[4][0]=((double)(pt.x-m_ptBallHoleBottomMiddle.x))/dDst[4];
				dAlfa[4][1]=((double)(pt.y-m_ptBallHoleBottomMiddle.y))/dDst[4];
				dAlfa[5][0]=((double)(pt.x-m_ptBallHoleBottomRight.x))/dDst[5];
				dAlfa[5][1]=((double)(pt.y-m_ptBallHoleBottomRight.y))/dDst[5];
			
				//击球点相对目标球位置
				m_ptCueBallPos[0].x=round(nBall*dAlfa[0][0]);
				m_ptCueBallPos[0].y=round(nBall*dAlfa[0][1]);
				m_ptCueBallPos[1].x=round(nBall*dAlfa[1][0]);
				m_ptCueBallPos[1].y=round(nBall*dAlfa[1][1]);
				m_ptCueBallPos[2].x=round(nBall*dAlfa[2][0]);
				m_ptCueBallPos[2].y=round(nBall*dAlfa[2][1]);
				m_ptCueBallPos[3].x=round(nBall*dAlfa[3][0]);
				m_ptCueBallPos[3].y=round(nBall*dAlfa[3][1]);
				m_ptCueBallPos[4].x=round(nBall*dAlfa[4][0]);
				m_ptCueBallPos[4].y=round(nBall*dAlfa[4][1]);
				m_ptCueBallPos[5].x=round(nBall*dAlfa[5][0]);
				m_ptCueBallPos[5].y=round(nBall*dAlfa[5][1]);

				//垂线相对目标球位置
				int nx, ny;
				int nf=nVerLine/nBall;
				nx=m_ptCueBallPos[0].x;
				ny=m_ptCueBallPos[0].y;
				m_ptVerLine[0][0].x=nx+nf*ny;
				m_ptVerLine[0][0].y=ny-nf*nx;
				m_ptVerLine[0][1].x=nx-nf*ny;
				m_ptVerLine[0][1].y=ny+nf*nx;
				nx=m_ptCueBallPos[1].x;
				ny=m_ptCueBallPos[1].y;			
				m_ptVerLine[1][0].x=nx+nf*ny;
				m_ptVerLine[1][0].y=ny-nf*nx;
				m_ptVerLine[1][1].x=nx-nf*ny;
				m_ptVerLine[1][1].y=ny+nf*nx;
				nx=m_ptCueBallPos[2].x;
				ny=m_ptCueBallPos[2].y;
				m_ptVerLine[2][0].x=nx+nf*ny;
				m_ptVerLine[2][0].y=ny-nf*nx;
				m_ptVerLine[2][1].x=nx-nf*ny;
				m_ptVerLine[2][1].y=ny+nf*nx;
				nx=m_ptCueBallPos[3].x;
				ny=m_ptCueBallPos[3].y;
				m_ptVerLine[3][0].x=nx+nf*ny;
				m_ptVerLine[3][0].y=ny-nf*nx;
				m_ptVerLine[3][1].x=nx-nf*ny;
				m_ptVerLine[3][1].y=ny+nf*nx;
				nx=m_ptCueBallPos[4].x;
				ny=m_ptCueBallPos[4].y;
				m_ptVerLine[4][0].x=nx+nf*ny;
				m_ptVerLine[4][0].y=ny-nf*nx;
				m_ptVerLine[4][1].x=nx-nf*ny;
				m_ptVerLine[4][1].y=ny+nf*nx;
				nx=m_ptCueBallPos[5].x;
				ny=m_ptCueBallPos[5].y;
				m_ptVerLine[5][0].x=nx+nf*ny;
				m_ptVerLine[5][0].y=ny-nf*nx;
				m_ptVerLine[5][1].x=nx-nf*ny;
				m_ptVerLine[5][1].y=ny+nf*nx;

				//保存目标球位置
				m_ptObjectBall.x=pt.x;
				m_ptObjectBall.y=pt.y;

				m_strStatus01="ALT+L目标球(已定位)";
				pMemDC->SelectObject(pOldBmp);
				ReleaseDC(pDC);
				delete pMemDC;
				pMemDC=NULL;

				m_nTimer01=SetTimer(2, 20, 0);
			}
			else
			{
				if(m_nTimer01)
				{
					m_strStatus01="ALT+L目标球(未定位)";
					KillTimer(m_nTimer01);
					m_nTimer01=0;
				}
			}
		}				
		break;
	case MYHOTKEY01://定位台桌
		GetCursorPos(&pt);
		//目标球球心坐标
		pt.x=pt.x+10;
		pt.y=pt.y-10;
		//上左洞
		m_ptBallHoleTopLeft.x=pt.x-8;
		m_ptBallHoleTopLeft.y=pt.y-332;
		//上中洞
		m_ptBallHoleTopMiddle.x=pt.x+259;
		m_ptBallHoleTopMiddle.y=pt.y-341;
		//上右洞
		m_ptBallHoleTopRight.x=pt.x+525;
		m_ptBallHoleTopRight.y=m_ptBallHoleTopLeft.y;
		//下左洞
		m_ptBallHoleBottomLeft.x=m_ptBallHoleTopLeft.x;
		m_ptBallHoleBottomLeft.y=pt.y-72;
		//下中洞
		m_ptBallHoleBottomMiddle.x=m_ptBallHoleTopMiddle.x;
		m_ptBallHoleBottomMiddle.y=pt.y-63;
		//下右洞
		m_ptBallHoleBottomRight.x=m_ptBallHoleTopRight.x;
		m_ptBallHoleBottomRight.y=m_ptBallHoleBottomLeft.y;

		m_strStatus = _T("F2定位台桌(已定位)");

		break;
	}
	UpdateData(FALSE);
	InvalidateRect(NULL, false);//重画窗口
	}
	return 0;
}

inline const int CTaiQiuDlg::round(double x)
{
	if(x>=0)
	{
		x=x+0.5;
	}
	else
	{
		x=x-0.5;
	}
	return((int)(x));
}

void CTaiQiuDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	switch(nType)
	{
	case SIZE_MINIMIZED:
		m_bPaint=FALSE;
		KillTimer(m_nTimer);
		KillTimer(m_nTimer01);

		if(m_pFloatThread)
		{
			m_pFloatThread->PostThreadMessage(WM_QUIT, NULL, NULL);
		}
		m_bMinimize=TRUE;
		break;
	case SIZE_RESTORED:
		m_pFloatThread=AfxBeginThread(RUNTIME_CLASS(CFloatThread));
		Sleep(200);
		m_bMinimize=FALSE;
		m_nTimer=SetTimer(1, 40, 0);
		break;
	}
}

⌨️ 快捷键说明

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