?? billiardsplayview.cpp
字號:
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 + -