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

📄 billiardsplayview.cpp

📁 桌面台球3D 开发环境VC 库DIRECTX8.1以上
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			if (m_nEnter != 100)
			{
				CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
				CBilliardsPlayView *pView = (CBilliardsPlayView *)(pFrame->m_wndSplitter).GetPane(0,1);
				CBilliardsDoc *pDoc = (CBilliardsDoc *)pView->GetDocument();
				CString strTemp;
				if (m_nEnter <= 0)
					m_bCanHit = !m_bCanHit;
				else
				{
					if (m_bCanHit)
					{
						//strTemp = _T("Hehe, 我进球了");
						//pDoc->SendMsg(strTemp);
					}
					if (pDoc->m_bPlayer == SERVER)
					{
						for (j=8; j>0; j--)
							if (m_bVisible[j])
								break;
						if (j<=0)
						{
							//pDoc->WinGame();
						}
						else if (m_bCanHit && !m_bVisible[8])
						{
							//pDoc->LoseGame();
						}
						else
						{
							for (j=8; j<NUM_BALL; j++)
								if (m_bVisible[j])
									break;
							if (j>=NUM_BALL)
							{
							//	pDoc->LoseGame();
							}
							else if (!m_bCanHit && !m_bVisible[8])
							{
							//	pDoc->WinGame();
							}
						}
					}
					else if (pDoc->m_bPlayer == CLIENT)
					{
						for (j=8; j<NUM_BALL; j++)
							if (m_bVisible[j])
								break;
						if (j>=NUM_BALL)
						{
							//pDoc->WinGame();
						}
						else if (m_bCanHit && !m_bVisible[8])
						{
							//pDoc->LoseGame();
						}
						else
						{
							for (j=8; j>0; j--)
								if (m_bVisible[j])
									break;
							if (j<=0)
							{
							//	pDoc->LoseGame();
							}
							else if (!m_bCanHit && !m_bVisible[8])
							{
							//	pDoc->WinGame();
							}
						}
					}

					if (!m_bVisible[0])
						m_bCanHit = !m_bCanHit;
				}

				if (pDoc->m_bPlayer == IDLE)
					m_bCanHit = TRUE;
				else
				{
					if (m_bCanHit)
					{
						//strTemp = _T("1该我击球");
						//pDoc->m_pClientSocket->Send(strTemp,strTemp.GetLength());
					}
				}
			}

			if (!m_bVisible[0]) //母球落袋后重画母球
			{
				m_fPosition[0][1]=m_fPosition[0][2]=0.0f;
				m_fPosition[0][0] = - 2.0*TABLE_LENGTH/3.0;
				m_bVisible[0]=TRUE;
			}
			m_fStrength=22.5f;
			m_fDirection[0]=1.0f;
			m_fDirection[2]=0.0f;
			m_fVelocity[0][0]=5.0f;
		}
	}

	DrawPlayground();
	DrawBall();

	if (!m_bAnimate)
	{
		glPushName(1);
		DrawArrow();
		glPopName();
	}

	glMatrixMode(GL_MODELVIEW);
	glPopMatrix();
	
	glFlush();
	SwapBuffers(m_hDc);				//交换缓冲区
}

void CBilliardsPlayView::DrawArrow()
{
	float angle;
	int mode;

	glGetIntegerv(GL_RENDER_MODE , &mode);
	glDisable(GL_LIGHTING);
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();

	glTranslatef(0.0f, TABLE_HEIGHT/2.0+2.0*BALL_RADIUS, 0.0f);
	glTranslatef(m_fPosition[0][0],m_fPosition[0][1],m_fPosition[0][2]);
	glColor3f(0.5f,0.5f,0.0f);
	glLineWidth(1.5);
	if (m_fDirection[0]>=0.0)
		angle = asin(m_fDirection[2])/M_PI*180.0;
	else
		angle = 180.0 - asin(m_fDirection[2])/M_PI*180.0;

	glRotatef(-angle,0.0f,1.0f,0.0f);
	glBegin(GL_LINES);
	glVertex3f(0.0f,0.0f,0.0f);
	glVertex3f(m_fStrength,0.0,0.0);
	glEnd();
	glTranslatef(m_fStrength,0.0f,0.0f);
	glBegin(GL_TRIANGLES);
	glVertex3f(-2.0f, 0.0f, 2.0f);
	glVertex3f(-2.0f, 0.0f, -2.0f);
	glVertex3f(3.0f, 0.0f, 0.0f);
	glEnd();

	glPopMatrix();
	glEnable(GL_LIGHTING);
	glLineWidth(1.0);
}

int CBilliardsPlayView::Calculate()
{
	CMainFrame *pView=(CMainFrame *)(AfxGetMainWnd());

	float x1,z1,x2,z2,x3,z3;
	float tmpf,minf;
	BOOL mark[NUM_BALL][NUM_BALL];
	int i,j;
	int k;

	x1 = TABLE_LENGTH - BAR_WIDTH;
	z1 = TABLE_WIDTH - BAR_WIDTH;
	x2 = 0.0;
	z2 = TABLE_WIDTH;

	for (i=0;i<NUM_BALL;i++)
		if (m_bVisible[i])
		{
			x3 = fabs(m_fPosition[i][0]);
			z3 = fabs(m_fPosition[i][2]);
			if (((x1-x3)*(x1-x3)+(z1-z3)*(z1-z3)<2.0*BALL_RADIUS*BALL_RADIUS)||
				((x2-x3)*(x2-x3)+(z2-z3)*(z2-z3)<2.0*BALL_RADIUS*BALL_RADIUS))//球进洞了
			{
				m_bVisible[i] = FALSE;
				if(pView->m_bSoundGoal)
					sndPlaySound("res\\goal.wav",SND_ASYNC);
				if (m_nEnter<i)       //?
					m_nEnter = i;
			}
		}

	for (i=0;i<NUM_BALL;i++)
		for (j=0;j<NUM_BALL;j++)
			mark[i][j]=FALSE;

	for (i=0;i<NUM_BALL;i++)
		if (m_bVisible[i])
		{
			if ((m_fPosition[i][0]>TABLE_LENGTH-BAR_WIDTH-BALL_RADIUS)&&(fabs(m_fPosition[i][2])<TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS))
			{//右壁
				m_fPosition[i][0]=TABLE_LENGTH-BAR_WIDTH-BALL_RADIUS;
				hitx=INFINITY;
                hitz=INFINITY;
				if (m_fVelocity[i][0]>0.0){
					m_fVelocity[i][0] = -DECR*m_fVelocity[i][0];
					if(pView->m_bSoundCush)
						sndPlaySound("res\\cush.wav",SND_ASYNC);
				}

			}
			else if ((m_fPosition[i][0]<-(TABLE_LENGTH-BAR_WIDTH-BALL_RADIUS))&&(fabs(m_fPosition[i][2])<TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS))
			{//左壁
				m_fPosition[i][0]=-(TABLE_LENGTH-BAR_WIDTH-BALL_RADIUS);
				hitx=INFINITY;
                hitz=INFINITY;
				if (m_fVelocity[i][0]<0.0){
					m_fVelocity[i][0] = -DECR*m_fVelocity[i][0];
					if(pView->m_bSoundCush)
						sndPlaySound("res\\cush.wav",SND_ASYNC);
				}
			}
			else if ((m_fPosition[i][2]>TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS)&&(fabs(m_fPosition[i][0])>1.2*BALL_RADIUS))
			{//上壁
				m_fPosition[i][2]=TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS;
				hitx=INFINITY;
                hitz=INFINITY;
				if (m_fVelocity[i][2]>0.0){
					m_fVelocity[i][2] = -DECR*m_fVelocity[i][2];
					if(pView->m_bSoundCush)
						sndPlaySound("res\\cush.wav",SND_ASYNC);
				}
			}
			else if ((m_fPosition[i][2]<-(TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS))&&(fabs(m_fPosition[i][0])>1.2*BALL_RADIUS))
			{//下壁
				m_fPosition[i][2]=-(TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS);
				hitx=INFINITY;
                hitz=INFINITY;
				if (m_fVelocity[i][2]<0.0){
					m_fVelocity[i][2] = -DECR*m_fVelocity[i][2];
					if(pView->m_bSoundCush)
						sndPlaySound("res\\cush.wav",SND_ASYNC);
				}
			}
			else//不碰壁
			{
				minf = 8*BALL_RADIUS*BALL_RADIUS;
				for (j=0;j<NUM_BALL;j++)
					if (m_bVisible[j]&&(i!=j)&&!mark[i][j])
					{
						tmpf = (m_fPosition[i][0]-m_fPosition[j][0])*(m_fPosition[i][0]-m_fPosition[j][0])+(m_fPosition[i][2]-m_fPosition[j][2])*(m_fPosition[i][2]-m_fPosition[j][2]);
						//两球心距离的平方和
                        if (tmpf<minf)
						{
							minf=tmpf;
							k=j;
						}
					}
				    if (minf<=4*BALL_RADIUS*BALL_RADIUS)//两球心距离的平方和
    				{
					    float line[3];
					    float t1,t2;
					    float vec1[3],vec2[3],vec3[3],vec4[3];
    
					    line[0]=m_fPosition[k][0]-m_fPosition[i][0];    //x坐标差
					    line[1]=0.0f;
					    line[2]=m_fPosition[k][2]-m_fPosition[i][2];    //z坐标差
					    t1 = sqrt(DOTPROD3(line,line));                 //长度
					    if (t1>0.0)
    						VEC3_V_OP_S(line,line,/,t1);                //line[i]=line[i]/t1,成单位向量
    
					    t1=DOTPROD3(m_fVelocity[i],line);               //i号球的速度乘单位向量
					    t2=DOTPROD3(m_fVelocity[k],line);               //k号球的速度乘单位向量
					    VEC3_V_OP_S(vec1,line,*,t1);                    //恢复原line的长度,放入vec1
					    VEC3_V_OP_V(vec1,m_fVelocity[i],-,vec1);        //i号球的x,z方向的分速度-vec1x,z方向分速度
					    VEC3_V_OP_S(vec2,line,*,t2);                    //k号球的速度
					    VEC3_V_OP_V(vec2,m_fVelocity[k],-,vec2);        //
					    if (t1-t2>0.0)
					    {
    						VEC3_V_OP_S(vec3,line,*,t2);
						    VEC3_V_OP_V(m_fVelocity[i],vec1,+,vec3);
						    VEC3_V_OP_S(vec4,line,*,t1);
						    VEC3_V_OP_V(m_fVelocity[k],vec2,+,vec4);
						    mark[i][k]=mark[k][i]=TRUE;
							if(pView->m_bSoundBall)
							sndPlaySound("res\\ball2ball.wav",SND_ASYNC);
					    }
						hitx=INFINITY;
						hitz=INFINITY;
						
				    }
			    }
			
		    	if (fabs(m_fPosition[i][0])>TABLE_LENGTH||fabs(m_fPosition[i][2])>TABLE_WIDTH)
    			{
				    m_bVisible[i]=FALSE;
					if(pView->m_bSoundGoal)
						sndPlaySound("res\\goal.wav",SND_ASYNC);
				    if (m_nEnter<i)
    					m_nEnter = i;
			    }
		    }

	for (i=0;i<NUM_BALL;i++)
		if (m_bVisible[i])
		{
			float t1,s1;
			float vec1[3];

			t1 = sqrt(DOTPROD3(m_fVelocity[i],m_fVelocity[i]));
			if (t1>0.0f)
			{
				VEC3_V_OP_S(vec1,m_fVelocity[i],/,t1);
				s1 = t1+ACCELERATION/2.0;
				t1 = t1+ACCELERATION;
				if (t1<-0.1*ACCELERATION)    //速度小于一定值就停下来
				{
					s1=0.0f;
					t1=0.0f;
				}
				VEC3_V_OP_S(m_fVelocity[i],vec1,*,t1);
				VEC3_V_OP_S(vec1,vec1,*,s1);
                
                if(i==0){
                    if(DOTPROD3(vec1,vec1)>((m_fPosition[i][0]-hitx)*(m_fPosition[i][0]-hitx)+(m_fPosition[i][2]-hitz)*(m_fPosition[i][2]-hitz))){
                        m_fPosition[i][0]=hitx;
                        m_fPosition[i][2]=hitz;
                        hitx=INFINITY;
                        hitz=INFINITY;
                    }
                    else
				        VEC3_V_OP_V(m_fPosition[i],m_fPosition[i],+,vec1);
                }
                else
                    VEC3_V_OP_V(m_fPosition[i],m_fPosition[i],+,vec1);

				x3 = fabs(m_fPosition[i][0]);
				z3 = fabs(m_fPosition[i][2]);
				if (((x1-x3)*(x1-x3)+(z1-z3)*(z1-z3)<BALL_RADIUS*BALL_RADIUS)||
					((x2-x3)*(x2-x3)+(z2-z3)*(z2-z3)<BALL_RADIUS*BALL_RADIUS))
					;
				//以下防止球越界过多
                else if ((m_fPosition[i][0]>TABLE_LENGTH-BAR_WIDTH-BALL_RADIUS)&&(fabs(m_fPosition[i][2])<TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS))
				{
					m_fPosition[i][0]=TABLE_LENGTH-BAR_WIDTH-BALL_RADIUS+0.01;
                    
				}
				else if ((m_fPosition[i][0]<-(TABLE_LENGTH-BAR_WIDTH-BALL_RADIUS))&&(fabs(m_fPosition[i][2])<TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS))
				{
					m_fPosition[i][0]=-(TABLE_LENGTH-BAR_WIDTH-BALL_RADIUS)-0.01;
                    hitx=INFINITY;
                    hitz=INFINITY;
				}
				else if ((m_fPosition[i][2]>TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS)&&(fabs(m_fPosition[i][0])>1.2*BALL_RADIUS))
				{
					m_fPosition[i][2]=TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS+0.01;
                    hitx=INFINITY;
                    hitz=INFINITY;
				}
				else if ((m_fPosition[i][2]<-(TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS))&&(fabs(m_fPosition[i][0])>1.2*BALL_RADIUS))
				{
					m_fPosition[i][2]=-(TABLE_WIDTH-BAR_WIDTH-BALL_RADIUS)-0.01;
                    hitx=INFINITY;
                    hitz=INFINITY;
				}
				
				for (j=0;j<NUM_BALL;j++)
					if (m_bVisible[j]&&(i!=j))
					{
						tmpf = (m_fPosition[i][0]-m_fPosition[j][0])*(m_fPosition[i][0]-m_fPosition[j][0])+(m_fPosition[i][2]-m_fPosition[j][2])*(m_fPosition[i][2]-m_fPosition[j][2]);
						if (tmpf<4*BALL_RADIUS*BALL_RADIUS)
							
							break;
					}
				if (j<NUM_BALL)     //出现两球距离小于直径的情况
				{
					
					VEC3_V_OP_S(vec1,vec1,/,2.0);
					VEC3_V_OP_V(m_fPosition[i],m_fPosition[i],-,vec1); 
					
				}
			}
		}

	for (i=0;i<NUM_BALL;i++)
		if (m_bVisible[i])
			if ((m_fVelocity[i][0]!=0.0)||(m_fVelocity[i][2]!=0.0))
				break;

	if (i<NUM_BALL)
		return 0;
	return 1;
}

void CBilliardsPlayView::MouseSpinGlobal(UINT nFlags, int x, int y, int init)
{
	float centerX, centerY;
	float radius;
	float w, h;  // window

    RECT rect;
    GetClientRect( &rect);
    w =(float)rect.right;
	h =(float)rect.bottom;
    h = (h == 0.0f) ? 1.0f : h;

⌨️ 快捷键说明

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