#include "StdAfx.h" #include "Resource.h" #include "GameClientView.h" ////////////////////////////////////////////////////////////////////////// //按钮标识 #define IDC_START 100 //开始按钮 #define IDC_TRUSTEE_CONTROL 104 //托管控制 #define IDI_GANG_SOCRE 105 // //动作标识 #define IDI_BOMB_EFFECT 101 //动作标识 //动作数目 #define BOMB_EFFECT_COUNT 12 //动作数目 #define DISC_EFFECT_COUNT 8 //丢弃效果 #define TIME_GANG_SCORE 70 // #define GANG_MOVE_COUNT 14 // #define TIME_CX 65 #define TIME_CY 69 #define BORDER_CX 0 #define BORDER_CY 0 ////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(CGameClientView, CGameFrameViewGDI) ON_WM_CREATE() ON_WM_SETCURSOR() ON_WM_LBUTTONDOWN() ON_BN_CLICKED(IDC_START, OnStart) ON_BN_CLICKED(IDC_TRUSTEE_CONTROL,OnStusteeControl) ON_WM_TIMER() END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////// //构造函数 CGameClientView::CGameClientView() { //标志变量 m_bOutCard=false; m_bWaitOther=false; ZeroMemory( m_lGangScore,sizeof(m_lGangScore) ); m_wGangChairId = INVALID_CHAIR; //游戏属性 m_lCellScore=0L; m_wBankerUser=INVALID_CHAIR; m_wCurrentUser=INVALID_CHAIR; ZeroMemory( m_cbWinOrder,sizeof(m_cbWinOrder) ); //动作动画 m_bBombEffect=false; m_cbBombFrameIndex=0; //丢弃效果 m_wDiscUser=INVALID_CHAIR; m_cbDiscFrameIndex=0; //用户状态 m_cbCardData=0; m_wOutCardUser=INVALID_CHAIR; ZeroMemory(m_cbUserAction,sizeof(m_cbUserAction)); ZeroMemory(m_bTrustee,sizeof(m_bTrustee)); //加载位图 HINSTANCE hInstance=AfxGetInstanceHandle(); m_ImageWait.LoadFromResource(hInstance, IDB_WAIT_TIP); m_ImageBack.LoadFromResource(hInstance, IDB_VIEW_BACK); m_ImageUserFlag.LoadFromResource(hInstance, IDB_USER_FLAG); m_ImageOutCard.LoadFromResource(hInstance, IDB_OUT_CARD_TIP); m_ImageUserAction.LoadFromResource(hInstance, IDB_USER_ACTION); m_ImageActionBack.LoadFromResource(hInstance, IDB_ACTION_BACK); m_ImageTrustee.LoadImage(hInstance,TEXT("TRUSTEE")); m_ImageActionAni.LoadImage(AfxGetInstanceHandle(),TEXT("ActionAni")); m_ImageDisc.LoadImage(AfxGetInstanceHandle(),TEXT("DISC")); m_ImageArrow.LoadImage(AfxGetInstanceHandle(),TEXT("ARROW")); m_ImageCenter.LoadFromResource(hInstance, IDB_VIEW_CENTER); m_ImageWinOrder.LoadFromResource(hInstance, IDB_WIN_ORDER); m_ImageCellScore.LoadImage(AfxGetInstanceHandle(),TEXT("CELL_SCORE")); m_PngNumLost.LoadImage(AfxGetInstanceHandle(),TEXT("NUM_LOST")); m_PngNumWin.LoadImage(AfxGetInstanceHandle(),TEXT("NUM_WIN")); m_PngXiaYu.LoadImage(AfxGetInstanceHandle(),TEXT("XIAO_YU")); m_PngGuaFeng.LoadImage(AfxGetInstanceHandle(),TEXT("GUA_FENG")); return; } //析构函数 CGameClientView::~CGameClientView(void) { } //建立消息 int CGameClientView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (__super::OnCreate(lpCreateStruct)==-1) return -1; //变量定义 enDirection Direction[]={Direction_North,Direction_East,Direction_South,Direction_West}; //设置控件 for (WORD i=0;i<4;i++) { //用户扑克 m_HeapCard[i].SetDirection(Direction[i]); m_TableCard[i].SetDirection(Direction[i]); m_DiscardCard[i].SetDirection(Direction[i]); //组合扑克 m_WeaveCard[i][0].SetDisplayItem(true); m_WeaveCard[i][1].SetDisplayItem(true); m_WeaveCard[i][2].SetDisplayItem(true); m_WeaveCard[i][3].SetDisplayItem(true); m_WeaveCard[i][0].SetDirection(Direction[i]); m_WeaveCard[i][1].SetDirection(Direction[i]); m_WeaveCard[i][2].SetDirection(Direction[i]); m_WeaveCard[i][3].SetDirection(Direction[i]); } //设置控件 m_UserCard[0].SetDirection(Direction_North); m_UserCard[1].SetDirection(Direction_East); m_UserCard[2].SetDirection(Direction_West); //创建控件 CRect rcCreate(0,0,0,0); m_ControlWnd.Create(NULL,NULL,WS_CHILD|WS_CLIPCHILDREN,rcCreate,this,10,NULL); m_DrawSiceWnd.Create(NULL,NULL,WS_CHILD|WS_CLIPCHILDREN,rcCreate,this,11,NULL); //创建控件 m_btStart.Create(NULL,WS_CHILD|WS_CLIPCHILDREN,rcCreate,this,IDC_START); m_btStart.SetButtonImage(IDB_BT_START,AfxGetInstanceHandle(),false,false); //托管按钮 m_btStusteeControl.Create(TEXT(""),WS_CHILD|WS_DISABLED|WS_VISIBLE,rcCreate,this,IDC_TRUSTEE_CONTROL); m_btStusteeControl.SetButtonImage(IDB_BT_START_TRUSTEE,AfxGetInstanceHandle(),false,false); SetTimer(IDI_DISC_EFFECT,250,NULL); //test //m_btStart.ShowWindow( SW_SHOW ); //BYTE byCard[] = { // 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, // 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, // 0x01,0x02,0x03,0x04,0x05,0x06 //}; //BYTE byCardCount = 14; //m_HandCardControl.SetDisplayItem(true); //m_HandCardControl.SetPositively(true); //m_HandCardControl.SetCardData(byCard,MAX_COUNT-1-3,byCard[MAX_COUNT-1]); //for( BYTE i = 0; i < GAME_PLAYER; i++ ) //{ // m_HeapCard[i].SetCardData(0,0,HEAP_FULL_COUNT); // m_TableCard[i].SetCardData(byCard,byCardCount); // m_DiscardCard[i].SetCardData(byCard,byCardCount); // m_WeaveCard[i][0].SetCardData(byCard,3); // if( i < 3 ) // m_UserCard[i].SetCardData(MAX_COUNT-1,false); // m_bTrustee[i] = true; // m_cbUserAction[i] = WIK_PENG; // m_cbWinOrder[i] = i+1; //} //m_bWaitOther = true; //m_bOutCard = true; //m_wOutCardUser = 0; //m_cbCardData = 0x01; //m_cbUserAction[0] = WIK_NULL; //m_wDiscUser = 1; //SetBombEffect(true); //tagScoreInfo si; //ZeroMemory( &si,sizeof(si) ); //for( WORD i = 0; i < GAME_PLAYER; i++ ) // lstrcpy( si.szUserName[i],TEXT("杨杨得意") ); //for( WORD i = 0; i < GAME_PLAYER; i++ ) //{ // si.wMeChairId = i; // si.cbGenCount = i+1; // si.cbWinOrder= i+1; // if( i%2==0 ) // { // si.dwChiHuRight[0] = CHR_QING_LONG_QI_DUI; // si.lGameScore = 1234L; // } // else si.lGameScore = -1234L; // si.wLostFanShu[(i+1)%GAME_PLAYER] = 5; // si.wLostFanShu[(i+2)%GAME_PLAYER] = 6; // si.lGameTax = 1234L; // si.lGangScore = 124L; // si.wProvideUser = 3; // m_ScoreControl[i].SetScoreInfo( si ); //} //end test return 0; } //重置界面 void CGameClientView::ResetGameView() { //标志变量 m_bOutCard=false; m_bWaitOther=false; ZeroMemory( m_lGangScore,sizeof(m_lGangScore) ); m_wGangChairId = INVALID_CHAIR; //游戏属性 m_lCellScore=0L; m_wBankerUser=INVALID_CHAIR; m_wCurrentUser=INVALID_CHAIR; ZeroMemory( m_cbWinOrder,sizeof(m_cbWinOrder) ); //动作动画 m_bBombEffect=false; m_cbBombFrameIndex=0; //丢弃效果 m_wDiscUser=INVALID_CHAIR; m_cbDiscFrameIndex=0; //用户状态 m_cbCardData=0; m_wOutCardUser=INVALID_CHAIR; ZeroMemory(m_cbUserAction,sizeof(m_cbUserAction)); //界面设置 m_btStart.ShowWindow(SW_HIDE); m_ControlWnd.ShowWindow(SW_HIDE); for( WORD i = 0; i < GAME_PLAYER; i++ ) m_ScoreControl[i].RestorationData(); //禁用控件 m_btStusteeControl.EnableWindow(FALSE); //扑克设置 m_UserCard[0].SetCardData(0,false); m_UserCard[1].SetCardData(0,false); m_UserCard[2].SetCardData(0,false); m_HandCardControl.SetPositively(false); m_HandCardControl.SetDisplayItem(false); m_HandCardControl.SetCardData(NULL,0,0); //扑克设置 for (WORD i=0;iSetTextColor(RGB(255,255,0)); for (WORD i=0;iszName,TEXT("SSSSSssssssssssss")); //pUserData->cbUserStatus = US_READY; //end test if (pUserData!=NULL) { //用户名字 pDC->SetTextAlign((i==1)?(TA_RIGHT|TA_TOP):(TA_LEFT|TA_TOP)); DrawTextString(pDC, pUserData->GetNickName(), RGB(255,255,255), RGB(0,0,0), m_ptNickName[i].x, m_ptNickName[i].y, false); //胡牌先后 if( m_cbWinOrder[i] != 0 ) { INT nWinOrderWidth = m_ImageWinOrder.GetWidth()/4; INT nWinOrderHeight = m_ImageWinOrder.GetHeight(); m_ImageWinOrder.TransDrawImage( pDC,m_ptWinOrder[i].x-nWinOrderWidth/2,m_ptWinOrder[i].y-nWinOrderHeight/2, nWinOrderWidth,nWinOrderHeight,(m_cbWinOrder[i]-1)*nWinOrderWidth,0,RGB(255,0,255) ); } //其他信息 WORD wUserTimer=GetUserClock(i); //test //wUserTimer = 30; //end test if ((wUserTimer!=0)&&(m_wCurrentUser!=INVALID_CHAIR)) { DrawUserClock(pDC,nWidth/2,nHeight/2 + 24,wUserTimer); if(m_wCurrentUser==0) m_ImageArrow.DrawImage(pDC, nWidth/2-15, //X坐标 nHeight/2-m_ImageArrow.GetHeight()*2 + 24, //Y坐标 m_ImageArrow.GetWidth()/4, //宽 m_ImageArrow.GetHeight(), //高 m_ImageArrow.GetWidth()/4*m_wCurrentUser,//起始位置X 0); if(m_wCurrentUser==1) m_ImageArrow.DrawImage(pDC,nWidth/2+m_ImageArrow.GetWidth()/4,nHeight/2-15 + 24,m_ImageArrow.GetWidth()/4,m_ImageArrow.GetHeight(),m_ImageArrow.GetWidth()/4*m_wCurrentUser,0); if(m_wCurrentUser==2) m_ImageArrow.DrawImage(pDC,nWidth/2-15,nHeight/2+m_ImageArrow.GetHeight() + 24,m_ImageArrow.GetWidth()/4,m_ImageArrow.GetHeight(),m_ImageArrow.GetWidth()/4*m_wCurrentUser,0); if(m_wCurrentUser==3) m_ImageArrow.DrawImage(pDC,nWidth/2-m_ImageArrow.GetWidth()/4*2,nHeight/2-15 + 24,m_ImageArrow.GetWidth()/4,m_ImageArrow.GetHeight(),m_ImageArrow.GetWidth()/4*m_wCurrentUser,0); } if((wUserTimer!=0)&&(m_wCurrentUser==INVALID_CHAIR)) { DrawUserClock(pDC,nWidth/2,nHeight/2,wUserTimer); if(i==0) m_ImageArrow.DrawImage(pDC,nWidth/2-15,nHeight/2-m_ImageArrow.GetHeight()*2,m_ImageArrow.GetWidth()/4,m_ImageArrow.GetHeight(),m_ImageArrow.GetWidth()/4*i,0); if(i==1) m_ImageArrow.DrawImage(pDC,nWidth/2+m_ImageArrow.GetWidth()/4,nHeight/2-15,m_ImageArrow.GetWidth()/4,m_ImageArrow.GetHeight(),m_ImageArrow.GetWidth()/4*i,0); if(i==2) m_ImageArrow.DrawImage(pDC,nWidth/2-15,nHeight/2+m_ImageArrow.GetHeight(),m_ImageArrow.GetWidth()/4,m_ImageArrow.GetHeight(),m_ImageArrow.GetWidth()/4*i,0); if(i==3) m_ImageArrow.DrawImage(pDC,nWidth/2-m_ImageArrow.GetWidth()/4*2,nHeight/2-15,m_ImageArrow.GetWidth()/4,m_ImageArrow.GetHeight(),m_ImageArrow.GetWidth()/4*i,0); } if (pUserData->GetUserStatus() == US_READY) { DrawUserReady(pDC,m_ptReady[i].x,m_ptReady[i].y); } DrawUserAvatar(pDC,m_ptAvatar[i].x,m_ptAvatar[i].y,pUserData); //托管 if(m_bTrustee[i]) { m_ImageTrustee.DrawImage(pDC,m_PointTrustee[i].x,m_PointTrustee[i].y); } } //test //delete pUserData; //end test } //用户标志 if (m_wBankerUser!=INVALID_CHAIR) { //加载位图 int nImageWidth=m_ImageUserFlag.GetWidth()/4; int nImageHeight=m_ImageUserFlag.GetHeight(); //绘画标志 for (WORD i=0;i 0 ) DrawNumberString( pDC,m_PngNumWin,m_ptGangScore[i].x,m_ptGangScore[i].y-m_nYGangStep*3,m_lGangScore[i],true,true ); else DrawNumberString( pDC,m_PngNumLost,m_ptGangScore[i].x,m_ptGangScore[i].y-m_nYGangStep*3,m_lGangScore[i],true,true ); } } return; } //基础积分 void CGameClientView::SetCellScore(LONGLONG lCellScore) { //设置扑克 if (lCellScore!=m_lCellScore) { //设置变量 m_lCellScore=lCellScore; //更新界面 InvalidGameView(0,0,0,0); } return; } //庄家用户 void CGameClientView::SetBankerUser(WORD wBankerUser) { //设置用户 if (wBankerUser!=m_wBankerUser) { //设置变量 m_wBankerUser=wBankerUser; //更新界面 InvalidGameView(0,0,0,0); } return; } //状态标志 void CGameClientView::SetStatusFlag(bool bOutCard, bool bWaitOther) { //设置变量 m_bOutCard=bOutCard; m_bWaitOther=bWaitOther; //更新界面 InvalidGameView(0,0,0,0); return; } //出牌信息 void CGameClientView::SetOutCardInfo(WORD wViewChairID, BYTE cbCardData) { //设置变量 m_cbCardData=cbCardData; m_wOutCardUser=wViewChairID; //更新界面 InvalidGameView(0,0,0,0); return; } //动作信息 void CGameClientView::SetUserAction(WORD wViewChairID, BYTE bUserAction) { //设置变量 if (wViewChairID=0&&wTrusteeUserm_hDC,&tm ); nXPos -= tm.tmAveCharWidth*nStringLength/2; nYPos -= tm.tmHeight/2; } //绘画边框 pDC->SetTextColor(crFrame); for (int i=0;iTextOut(nXPos+nXExcursion[i],nYPos+nYExcursion[i],pszString,nStringLength); } //绘画字体 pDC->SetTextColor(crText); pDC->TextOut(nXPos,nYPos,pszString,nStringLength); return; } //光标消息 BOOL CGameClientView::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT uMessage) { //获取光标 CPoint MousePoint; GetCursorPos(&MousePoint); ScreenToClient(&MousePoint); //点击测试 bool bRePaint=false; bool bHandle=m_HandCardControl.OnEventSetCursor(MousePoint,bRePaint); //重画控制 if (bRePaint==true) InvalidGameView(0,0,0,0); //光标控制 if (bHandle==false) __super::OnSetCursor(pWnd,nHitTest,uMessage); return TRUE; } //鼠标消息 void CGameClientView::OnLButtonDown(UINT nFlags, CPoint Point) { __super::OnLButtonDown(nFlags, Point); //获取扑克 BYTE cbHoverCard=m_HandCardControl.GetHoverCard(); if (cbHoverCard!=0) SendEngineMessage(IDM_OUT_CARD,cbHoverCard,cbHoverCard); //test //LONGLONG lGangScore[GAME_PLAYER] = { -12345,-12345,-12345,12345 }; //SetGangScore(2,0, lGangScore ); //end test return; } //开始按钮 void CGameClientView::OnStart() { //发送消息 SendEngineMessage(IDM_START,0,0); return; } //拖管控制 void CGameClientView::OnStusteeControl() { SendEngineMessage(IDM_TRUSTEE_CONTROL,0,0); return; } //定时器 void CGameClientView::OnTimer(UINT nIDEvent) { //动作动画 if (nIDEvent==IDI_BOMB_EFFECT) { //停止判断 if (m_bBombEffect==false) { KillTimer(IDI_BOMB_EFFECT); return; } //设置变量 if ((m_cbBombFrameIndex+1)>=BOMB_EFFECT_COUNT) { //删除时间 KillTimer(IDI_BOMB_EFFECT); //设置变量 m_bBombEffect=false; m_cbBombFrameIndex=0; } else m_cbBombFrameIndex++; //更新界面 InvalidGameView(0,0,0,0); return; } if (nIDEvent==IDI_DISC_EFFECT) { //设置变量 if ((m_cbDiscFrameIndex+1)>=DISC_EFFECT_COUNT) { m_cbDiscFrameIndex=0; } else m_cbDiscFrameIndex++; //更新界面 InvalidGameView(0,0,0,0); return; } else if( nIDEvent == IDI_GANG_SOCRE ) { m_cbGangIndex = (m_cbGangIndex+1)%4; if( ++m_nYGangStep == GANG_MOVE_COUNT ) { KillTimer( IDI_GANG_SOCRE ); m_wGangChairId = INVALID_CHAIR; ZeroMemory( m_lGangScore,sizeof(m_lGangScore) ); } InvalidGameView(0,0,0,0); return; } __super::OnTimer(nIDEvent); } // void CGameClientView::SetWinOrder( WORD wChairId, BYTE cbWinOrder ) { if( wChairId == INVALID_CHAIR ) ZeroMemory( m_cbWinOrder,sizeof(m_cbWinOrder) ); else m_cbWinOrder[wChairId] = cbWinOrder; InvalidGameView(0,0,0,0); } // void CGameClientView::SetGangScore( WORD wChairId, BYTE cbXiaYu, LONGLONG lGangScore[GAME_PLAYER] ) { CopyMemory( m_lGangScore,lGangScore,sizeof(m_lGangScore) ); m_wGangChairId = wChairId; m_cbXiaYu = cbXiaYu; for( WORD i = 0; i < GAME_PLAYER; i++ ) { if( m_lGangScore[i] != 0 ) { m_nYGangStep = 0; m_cbGangIndex = 0; SetTimer( IDI_GANG_SOCRE,TIME_GANG_SCORE,NULL ); InvalidGameView(0,0,0,0); break; } } } //绘画数字 void CGameClientView::DrawNumberString( CDC *pDC, CPngImage &PngNumber, int nXPos, int nYPos, LONGLONG lNumber, bool bDrawCenter, bool bDrawSign ) { int nWidthNumber = PngNumber.GetWidth()/12; int nHeightNumber = PngNumber.GetHeight(); int nXDrawPos = nXPos, nYDrawPos = nYPos; nYDrawPos -= nHeightNumber/2; TCHAR szNum[256] = {0}; _sntprintf(szNum,CountArray(szNum),TEXT("%+I64d"),lNumber); if( bDrawCenter ) { nXDrawPos -= (lstrlen(szNum)+(bDrawSign?0:-1))*nWidthNumber/2; } //正负号 if( bDrawSign ) { PngNumber.DrawImage( pDC,nXDrawPos,nYDrawPos,nWidthNumber,nHeightNumber,(lNumber<0?1:0)*nWidthNumber,0, nWidthNumber,nHeightNumber ); nXDrawPos += nWidthNumber; } for( int i = 1; i < lstrlen(szNum); i++ ) { if( ::isdigit(szNum[i]) ) { PngNumber.DrawImage( pDC,nXDrawPos,nYDrawPos,nWidthNumber,nHeightNumber,(((int)szNum[i]-48)+2)*nWidthNumber, 0,nWidthNumber,nHeightNumber ); } else { break; } nXDrawPos += nWidthNumber; } } //////////////////////////////////////////////////////////////////////////