📄 programview.cpp
字号:
int i;
//点到中间若轮到主机发牌则发牌(暂无动画)
/* if(isgoon && mx>=300&&my>=220&&mx<=476&&my<=312&&(pControl->m_Isserver)&&manager.Game_State==-1)
{ MessageBox("主机发牌");
pControl->StartCards();
}
*/
//将牌点起来
if(isgoon && mx>=100&&my>=440 && mx<=455&&my<=575)
{
CDC *pdc=GetDC();
for(i=0;manager.PlayCards[manager.PlayerAc][i].Num<=15;i++);
if(mx<=100+(i-1)*15+71&&my<=576&&mx>=100&&my>=440)
{
i=SelectNum(i,mx,my);//判断点中的是第几张牌
if(manager.DoMsg(i,1))
PrintAll();
}
ReleaseDC(pdc);
}
CView::OnLButtonDown(nFlags, point);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:SelectNum(int num,int mx,int my)
函数介绍:判断点中的是第几张牌
输入参数:int num,int mx,int my(当前玩家手中牌的数量,光标横坐标,光标纵坐标)
输出参数:无
返回值 :无
*/
int CProgramView::SelectNum(int num,int mx,int my)
{
if(mx>=100+(num-1)*15)
return num-1;
else
return (mx-100)/15;
}
//////////////////////////////////////////////////////////////////
/*
函数名称:OnSendCard()
函数介绍:响应出牌按钮
输入参数:无
输出参数:无
返回值 :无
*/
void CProgramView::OnSendCard()
{
if(isgoon && manager.DoMsg(15,4))
{
int k;
for(k=0;k<20&&manager.OutCards[k].Num<=15;k++)
OutCards[1][k]=manager.OutCards[k];
if(k!=20)
OutCards[1][k].Num=16;
PrintAll();
pControl->SendCards(manager.OutCards,4);
}
}
//////////////////////////////////////////////////////////////////
/*
函数名称:OnPass()
函数介绍:响应过牌按钮
输入参数:无
输出参数:无
返回值 :无
*/
void CProgramView::OnPass()
{
if(isgoon && manager.DoMsg(16,3))
{
OutCards[1][0].Num=16;
PrintAll();
pControl->SendCards(NULL,3);
}
}
//////////////////////////////////////////////////////////////////
/*
函数名称:DrawPlayername(char *s)
函数介绍:绘出玩家的姓名
输入参数:玩家姓名的字符串
输出参数:无
返回值 :无
*/
void CProgramView::DrawPlayername()
{
CDC *pdc=GetDC();
pdc->SetBkMode(TRANSPARENT); //设置背景为透明
// pDC->SetTextColor(RGB(255,255,255));//设置字体颜色
pdc->TextOut(40,400,PlayerName[0]);
pdc->TextOut(90,500,PlayerName[1]);
pdc->TextOut(660,400,PlayerName[2]);
ReleaseDC(pdc);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:DrawLeft()
函数介绍:绘出地主牌的情况,如果还没叫主,则是牌的背面,如果叫主,则为牌的正面
输入参数:无
输出参数:无
返回值 :无
*/
void CProgramView::DrawLeft()
{
CDC *pdc=GetDC();
int i;
if(manager.Game_State==-1)
{ for(i=0;i<3;i++)
pdc->BitBlt(300+i*40,25,72,97,&Mcard,142,384,SRCCOPY);
}
else if(manager.Game_State>=0&&manager.Game_State<=5)
{
for(i=0;i<3;i++)
{
if(manager.Sendleft[i].Num<14)
pdc->BitBlt(300+i*40,25,71,96,&Mcard,(manager.Sendleft[i].Num-1)*71,manager.Sendleft[i].Type*96,SRCCOPY);
else if(manager.Sendleft[i].Num<=15)
pdc->BitBlt(300+i*40,25,71,96,&Mcard,(manager.Sendleft[i].Num-14)*71,384,SRCCOPY);
}
}
ReleaseDC(pdc);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:DrawCardOut()
函数介绍:绘出当前玩家出的牌
输入参数:无
输出参数:无
返回值 :无
*/
void CProgramView::DrawCardOut(int k)
{
int i;
CDC *pdc=GetDC();
if(k==1||k==3)
{
pdc->BitBlt(100,330,360,96,&Background,0,0,SRCCOPY);
for(i=0;i<20&&OutCards[1][i].Num<=15;i++)
{
if(OutCards[1][i].Num<=13)
pdc->BitBlt(100+i*15,330,71,96,&Mcard,(OutCards[1][i].Num-1)*71,OutCards[1][i].Type*96,SRCCOPY);
else if(OutCards[1][i].Num<=15)
pdc->BitBlt(100+i*15,330,71,96,&Mcard,(OutCards[1][i].Num-14)*71,384,SRCCOPY);
}
}
if(k==2||k==3)
{
pdc->BitBlt(550,0,71,300,&Background,0,0,SRCCOPY);
for(i=0;i<20&&OutCards[2][i].Num<=15;i++)
{
if(OutCards[2][i].Num<14)
{
pdc->BitBlt(550,i*15,71,96,&Mcard,(OutCards[2][i].Num-1)*71,OutCards[2][i].Type*96,SRCCOPY);
}
else if(OutCards[2][i].Num<=15)
{
pdc->BitBlt(550,i*15,71,96,&Mcard,(OutCards[2][i].Num-14)*71,384,SRCCOPY);
}
}
}
if(k==0||k==3)
{
pdc->BitBlt(170,0,71,300,&Background,0,0,SRCCOPY);
for(i=0;i<20&&OutCards[0][i].Num<=15;i++)
{
if(OutCards[0][i].Num<14)
{
pdc->BitBlt(170,i*15,71,96,&Mcard,(OutCards[0][i].Num-1)*71,OutCards[0][i].Type*96,SRCCOPY);
}
else if(OutCards[0][i].Num<=15)
{
pdc->BitBlt(170,i*15,71,96,&Mcard,(OutCards[0][i].Num-14)*71,384,SRCCOPY);
}
}
}
ReleaseDC(pdc);
}
void CProgramView::PrintState()
{
CDC *pdc=GetDC();
pdc->SetBkMode(TRANSPARENT);
if(manager.Game_State==-2)
pdc->TextOut(266,5,"游戏还没开始");
else if(manager.Game_State==-1)
{ pdc->TextOut(266,5,"还在选择地主");
}
if(manager.PlayerMain==(manager.PlayerAc+1)%3)
pdc->TextOut(490,5,"右边的是地主");
else if(manager.PlayerMain==manager.PlayerAc)
pdc->TextOut(490,5,"你现在是地主");
else if(manager.PlayerMain==(manager.PlayerAc+2)%3)
pdc->TextOut(490,5,"左边的是地主");
if(manager.Game_State==manager.PlayerAc)
pdc->TextOut(100,5,"到你出牌了");
else if(manager.Game_State==(manager.PlayerAc+1)%3)
pdc->TextOut(100,5,"右边的出牌");
else if(manager.Game_State==(manager.PlayerAc+2)%3)
pdc->TextOut(100,5,"左边的出牌");
DrawPlayername();
ReleaseDC(pdc);
}
void CProgramView::PlayerPos()
{
cardmiddle=manager.PlayCards[manager.PlayerAc];
if(manager.PlayerAc==0)
{
cardleft=manager.PlayCards[2];
cardright=manager.PlayCards[1];
}
else if(manager.PlayerAc==1)
{ cardleft=manager.PlayCards[0];
cardright=manager.PlayCards[2];
}
else if(manager.PlayerAc==2)
{ cardleft=manager.PlayCards[1];
cardright=manager.PlayCards[0];
}
}
//重载PrintAll()实现发牌动画
void CProgramView::PrintAll(int type)
{
timer = 0;
isgoon = false;
SetTimer(1, 20, NULL);
}
//发牌动画
void CProgramView::OnTimer(UINT nIDEvent)
{
CDC *pdc=GetDC();
static int i(1);
int j;
static int x, y;
x = 300+54*2, y = 220;
if(timer<18)
{
//画没发出去的牌,飞行途中
pdc->BitBlt(300+(53-timer*3)*2,220,100,200,&Background,300+(53-timer*3)*2,220,SRCCOPY);
for(j=0;j<54-timer*3;j++)
pdc->BitBlt(300+j*2,220,72,97,&Mcard,142,384,SRCCOPY);
x -= timer*3*2;
//画发出去的牌
if(manager.PlayCards[manager.PlayerAc][timer].Num<14)
{
//擦除上次画的牌,用背景覆盖
if(i-1>0)
pdc->BitBlt(x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),71,96,&Background,
x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),SRCCOPY);
//画当前显示的牌
pdc->BitBlt(x+(100+timer*15-x)/10*i,y+(480-y)/10*i,71,96,&Mcard,
(manager.PlayCards[manager.PlayerAc][timer].Num-1)*71,
manager.PlayCards[manager.PlayerAc][timer].Type*96,SRCCOPY);
}
else if(manager.PlayCards[manager.PlayerAc][timer].Num<=15)
//画大小鬼
{
if(i-1>0)
pdc->BitBlt(x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),71,96,&Background,
x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),SRCCOPY);
pdc->BitBlt(x+(100+timer*15-x)/10*i,y+(480-y)/10*i,71,96,&Mcard,
(manager.PlayCards[manager.PlayerAc][timer].Num-14)*71,384,SRCCOPY);
}
if(cardleft[timer].Num<=15)
{
if(i-1>0)
pdc->BitBlt(x+(55-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),97,75,
&Background,x+(55-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),SRCCOPY);
pdc->BitBlt(x+(55-x)/10*i,y+(55+timer*10-y)/10*i,97,75,&Mcard,214,408,SRCCOPY);
}
if(cardright[timer].Num<=15)
{
if(i-1>0)
pdc->BitBlt(x+(630-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),97,75,
&Background,x+(630-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),SRCCOPY);
pdc->BitBlt(x+(630-x)/10*i,y+(55+timer*10-y)/10*i,97,75,&Mcard,214,408,SRCCOPY);
}
i++;
if(i==10)
//牌已经飞到指定位置
{
//檫除上一帧画的牌
if(manager.PlayCards[manager.PlayerAc][timer].Num<14)
{
pdc->BitBlt(x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),71,96,&Background,
x+(100+timer*15-x)/10*i,y+(480-y)/10*i,SRCCOPY);
}
else if(manager.PlayCards[manager.PlayerAc][timer].Num<=15)
{
pdc->BitBlt(x+(100+timer*15-x)/10*(i-1),y+(480-y)/10*(i-1),71,96,&Background,
x+(100+timer*15-x)/10*i,y+(480-y)/10*i,SRCCOPY);
}
if(cardleft[timer].Num<=15)
{
pdc->BitBlt(x+(55-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),97,75,
&Background,x+(55-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),SRCCOPY);
}
if(cardright[timer].Num<=15)
{
pdc->BitBlt(x+(630-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),97,75,
&Background,x+(630-x)/10*(i-1),y+(55+timer*10-y)/10*(i-1),SRCCOPY);
}
i=0;
//重画被背景覆盖的牌
if(timer>13)
{
if(manager.PlayCards[manager.PlayerAc][(timer-1)].Num<14)
{
pdc->BitBlt(100+(timer-1)*15,480,71,96,&Mcard,
(manager.PlayCards[manager.PlayerAc][(timer-1)].Num-1)*71,
manager.PlayCards[manager.PlayerAc][(timer-1)].Type*96,SRCCOPY);
}
else if(manager.PlayCards[manager.PlayerAc][(timer-1)].Num<=15)
{
pdc->BitBlt(100+(timer-1)*15,480,71,96,&Mcard,
(manager.PlayCards[manager.PlayerAc][(timer-1)].Num-14)*71,384,SRCCOPY);
}
}
//画出飞到的牌
if(manager.PlayCards[manager.PlayerAc][timer].Num<14)
{
pdc->BitBlt(100+timer*15,480,71,96,&Mcard,
(manager.PlayCards[manager.PlayerAc][timer].Num-1)*71,
manager.PlayCards[manager.PlayerAc][timer].Type*96,SRCCOPY);
}
else if(manager.PlayCards[manager.PlayerAc][timer].Num<=15)
{
pdc->BitBlt(100+timer*15,480,71,96,&Mcard,
(manager.PlayCards[manager.PlayerAc][timer].Num-14)*71,384,SRCCOPY);
}
if(cardleft[timer].Num<=15)
{
pdc->BitBlt(55,55+timer*10,97,75,&Mcard,214,408,SRCCOPY);
pdc->BitBlt(630,55+timer*10,97,75,&Mcard,214,408,SRCCOPY);
}
timer++;
}
}
else
{
KillTimer(1);
for(j=0;j<3;j++)
manager.SortCard(manager.PlayCards[j]);
PrintAll();
isgoon = true;
}
ReleaseDC(pdc);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -