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

📄 brewgamecanvas.cpp

📁 象棋框架
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	delete this;
}

IBrewCanvas *CreateGameCanvas(){
	return (IBrewCanvas *)new CBrewGameCanvas();
}

void CBrewGameCanvas::DrawChessBoard(IDisplay *d, IGraphics *g)
{
	CBrewGame *f = (CBrewGame *)frame;	
	int i,j,k;
	i=0;j=0;k=0;
	AEELine HLine[8],VLine[7],skrewLine[4]; 
	IDISPLAY_ClearScreen(d);
	////////////////////////////////两个外框///////////////////////////
	IGRAPHICS_SetColor(g,252,181,71,0);
	IGRAPHICS_SetFillColor(g,252,181,71,0);
	IGRAPHICS_SetFillMode(g,TRUE);
	IGRAPHICS_DrawRect(g,&f->m_pBoard->m_rectBackGround);
	IGRAPHICS_SetColor(g,0,0,0,0);
	IGRAPHICS_SetFillMode(g,FALSE);
	IGRAPHICS_DrawRect(g,&f->m_pBoard->m_rectWrap);
	IGRAPHICS_DrawRect(g,&f->m_pBoard->m_rectIn);
	///////////////////////////////19条线//////////////////////////////
	i=0;j=0;k=0;
	for(;i<90;i++){
		switch(i){
		case 9:case 18:case 27:case 36:case 45:case 54:case 63:case 72://case 81:
			HLine[j].sx=HLine[j].sy=HLine[j].ex=HLine[j].ey=0;
			HLine[j].sx=f->m_pBoard->m_joinPt[i].x-f->frame->getScreenOffsetX();
			HLine[j].sy=f->m_pBoard->m_joinPt[i].y-f->frame->getScreenOffsetY();
			HLine[j].ex=f->m_pBoard->m_joinPt[i+8].x-f->frame->getScreenOffsetX();
			HLine[j].ey=f->m_pBoard->m_joinPt[i+8].y-f->frame->getScreenOffsetY();
			IGRAPHICS_DrawLine(g,&HLine[j]);
			j++;
			break;
		case 1:case 2:case 3:case 4:case 5:case 6:case 7:
			VLine[j].sx=VLine[j].sy=VLine[j].ex=VLine[j].ey=0;
			VLine[k].sx=f->m_pBoard->m_joinPt[i].x-f->frame->getScreenOffsetX();
			VLine[k].sy=f->m_pBoard->m_joinPt[i].y-f->frame->getScreenOffsetY();
			VLine[k].ex=f->m_pBoard->m_joinPt[i+81].x-f->frame->getScreenOffsetX();
			VLine[k].ey=f->m_pBoard->m_joinPt[i+81].y-f->frame->getScreenOffsetY();
			IGRAPHICS_DrawLine(g,&VLine[k]);
			k++;
			break;
		}
	}	              ///////士走的斜线//////////////
	skrewLine[0].sx=skrewLine[1].sx=skrewLine[2].sx=skrewLine[3].sx=f->m_pBoard->m_joinPt[3].x-f->frame->getScreenOffsetX();
	skrewLine[0].ex=skrewLine[1].ex=skrewLine[2].ex=skrewLine[3].ex=f->m_pBoard->m_joinPt[5].x-f->frame->getScreenOffsetX();
	skrewLine[0].sy=skrewLine[1].ey=f->m_pBoard->m_joinPt[3].y-f->frame->getScreenOffsetY();
	skrewLine[0].ey=skrewLine[1].sy=f->m_pBoard->m_joinPt[21].y-f->frame->getScreenOffsetY();
	skrewLine[2].sy=skrewLine[3].ey=f->m_pBoard->m_joinPt[66].y-f->frame->getScreenOffsetY();
	skrewLine[2].ey=skrewLine[3].sy=f->m_pBoard->m_joinPt[84].y-f->frame->getScreenOffsetY();
	for(i=0;i<4;i++)
		IGRAPHICS_DrawLine(g,&skrewLine[i]);
	//////////////////////////////河界/////////////////////////////////
	IGRAPHICS_SetFillColor(g,252,181,71,0);
	IGRAPHICS_SetFillMode(g,TRUE);
	IGRAPHICS_DrawRect(g,&f->m_pBoard->m_rectMiddle);
	if(pRiver==NULL){
		CreateBitmap(d,&pRiver,f->m_nPicW,f->m_nPicH);
		IBITMAP_BltIn(pRiver,0,0,f->m_nPicW,f->m_nPicH,f->m_pRiver,0,0,AEE_RO_COPY);	
	}
	IDISPLAY_BitBlt(d, (f->frame->getScreenOffsetX()+f->m_pBoard->m_rectMiddle.x+(f->m_pBoard->m_rectMiddle.dx-f->m_nPicW)/2), (f->frame->getScreenOffsetY()+f->m_pBoard->m_rectMiddle.y+(f->m_pBoard->m_rectMiddle.dy-f->m_nPicH)/2),
						f->m_nPicW,f->m_nPicH ,(void*)pRiver,0,0,AEE_RO_TRANSPARENT);
	/////////////////////////////格子中间的折线////////////////////////
	j=0;
	for(i=0;i<90;i++){
		switch(i){
		case 28:case 30:case 32:case 34:case 57:case 59:case 63:case 69:
			j=0;	
			break;
		case 27:case 29:case 31:case 33:case 56:case 58:case 64:case 70:
			j=1;
			break;
		case 9: case 15:case 21:case 23:case 46:case 48:case 50:case 52:
			j=2;
			break;
		case 10:case 16:case 20:case 22:case 45:case 47:case 49:case 51:
			j=3;
			break;
		case 19:case 25:case 54:case 60:
			j=4;
			break;
		case 18:case 24:case 55:case 61:
			j=5;
			break;
		default:
			continue;
		}
		k=f->m_pBoard->m_nChessBoardSize*j;//k在这里就代表x轴偏移
		if(pImage[j]==NULL){
			CreateBitmap(d,&pImage[j],f->m_pBoard->m_nChessBoardSize,f->m_pBoard->m_nChessBoardSize);
			IBITMAP_BltIn(pImage[j],0,0,f->m_pBoard->m_nChessBoardSize,f->m_pBoard->m_nChessBoardSize,f->m_pImage,k,0,AEE_RO_COPY);
		}
		IDISPLAY_BitBlt(d, f->m_pBoard->m_joinPt[i].x, f->m_pBoard->m_joinPt[i].y,
						f->m_pBoard->m_nChessBoardSize,f->m_pBoard->m_nChessBoardSize ,(void*)pImage[j],0,0,AEE_RO_TRANSPARENT);
	}
	IGRAPHICS_Update(g);
	IDISPLAY_Update(d);
	return ;	
}

void CBrewGameCanvas::BuildMainMenu(){
	CBrewGame *f = (CBrewGame *)frame;
	UINT16 menuCnt=6,i;
	UINT16 strID[]={IDC_MAINMENU,
		IDC_MENUCHANGE,
		IDC_MENUCHAT,
		IDC_MENUGIVEUP,
		IDC_MENUREGRET,
		IDC_MENUCOMPROMISE
	};
	UINT16 picID[]={IDM_MAINMENU,
		IDM_MENUCHANGE,
		IDM_MENUCHAT,
		IDM_MENUGIVEUP,
		IDM_MENUREGRET,
		IDM_MENUCOMPROMISE
	};
	if(m_bMainMenu==FALSE){	
	IMENUCTL_SetRect( f->m_pMainMenuCtl, &f->m_rRect );
	SetMenuStyle(f->m_pMainMenuCtl);
	for(i=0;i<menuCnt;i++){
		AddMenuItem(f->m_pMainMenuCtl,strID[i],picID[i],strID[i],0);
	}
	m_bMainMenu=TRUE;
	}		
	IMENUCTL_SetActive(f->m_pMainMenuCtl,TRUE);
	return;	
}
boolean CBrewGameCanvas::AddMenuItem(IMenuCtl *pMenu, UINT16 wTextID, UINT16 wImageID, UINT16 wItemID, UINT32 dwData)
{
	CtlAddItem rMenuItem;
	rMenuItem.pszResImage = rMenuItem.pszResText = GAMEVV_RES_FILE;
	rMenuItem.wFont = AEE_FONT_NORMAL;	
	rMenuItem.pImage = NULL;
	rMenuItem.pText=NULL;
	rMenuItem.wImage=wImageID;
	rMenuItem.wText = wTextID;	
	rMenuItem.wItemID = wItemID;
	rMenuItem.dwData = dwData;
	return IMENUCTL_AddItemEx( pMenu, &rMenuItem );
}

void CBrewGameCanvas::BuildMenu()
{
	CBrewGame *f = (CBrewGame *)frame;
	UINT16 menuCnt=5,i;
	UINT16 ID[]={IDC_GAMEHELP,
		IDC_PLAYERINFO,
		IDC_GAMEQUIT,
		IDC_GAMEOVER,
		IDC_QUITMENU
	};
	if(m_bShowMenu==FALSE){		
		SetMenuStyle(f->m_pMenu);
		IMENUCTL_SetRect( f->m_pMenu, &f->m_rMenuRect );
		for(i=0;i<menuCnt;i++){
			IMENUCTL_AddItem (f->m_pMenu,GAMEVV_RES_FILE,ID[i],ID[i],NULL,0);
		}
		m_bShowMenu=TRUE;		
	}	
	IMENUCTL_SetActive(f->m_pMenu,TRUE);
	return;
}

void CBrewGameCanvas::SetMenuStyle(IMenuCtl *pMenuCtl)
{
	CBrewGame *f = (CBrewGame *)frame;
	AEEItemStyle rNormalStyle;
	AEEItemStyle rSelStyle;
	AEEMenuColors col;		
	// Menu Colors
	col.cSelText = MAKE_RGB(0, 0, 255);
	col.wMask = (MC_BACK | MC_SEL_BACK | MC_SEL_TEXT);
	col.cBack=MAKE_RGB(2, 128, 223);
	col.cSelBack=MAKE_RGB(161, 231, 254);
	ISHELL_GetItemStyle( f->m_pIShell, AEE_IT_MENU, &rNormalStyle, &rSelStyle );
	rNormalStyle.roImage = AEE_RO_TRANSPARENT;
	rSelStyle.roImage = AEE_RO_TRANSPARENT;
	rNormalStyle.xOffset = 0;
	rNormalStyle.yOffset = 0;
	rSelStyle.xOffset = 0;
	rSelStyle.yOffset = 0;
	IMENUCTL_SetStyle( pMenuCtl, &rNormalStyle, &rSelStyle );
	IMENUCTL_SetProperties( pMenuCtl, MP_ICON_TEXT_TOP );
	IMENUCTL_SetColors(pMenuCtl, &col);
	return;
}

void CBrewGameCanvas::DrawChess(IDisplay *d)
{
	CBrewGame *f = (CBrewGame *)frame;
	UINT16 x,y,i,Offset;
	INT8 valIndex=0;//在这里把XY定义为坐标位置,根据坐标位置定出在交点坐标中的索引
	for(i=0,x=0;x<9;x++)
		for(y=0;y<10;y++){
			if(f->m_cChessVal[x][y]!=0){
				i=(UINT16)(x+y*9);
				valIndex=(f->m_cChessVal[x][y]-'A');//根据此值确定使用哪个棋子
				Offset=f->m_pBoard->m_nChessBoardSize*valIndex;
				if(pChess[valIndex]==NULL){
					CreateBitmap(d,&pChess[valIndex],f->m_pBoard->m_nChessBoardSize,f->m_pBoard->m_nChessBoardSize);
					IBITMAP_BltIn(pChess[valIndex],0,0,
						f->m_pBoard->m_nChessBoardSize,f->m_pBoard->m_nChessBoardSize,f->m_pChess,Offset,0,AEE_RO_COPY);	
				}
				IDISPLAY_BitBlt(d, f->m_pBoard->m_joinPt[i].x-f->m_pBoard->m_nChessBoardSize/2,f->m_pBoard->m_joinPt[i].y-f->m_pBoard->m_nChessBoardSize/2,
						f->m_pBoard->m_nChessBoardSize,f->m_pBoard->m_nChessBoardSize ,(void*)pChess[valIndex],0,0,AEE_RO_TRANSPARENT);
			}
		}
	IDISPLAY_Update(d);
}

void CBrewGameCanvas::DrawHand(IDisplay *d){
	CBrewGame *f = (CBrewGame *)frame;
	RGBVAL clrRGB;
	f->m_HandPos.x=xPos;//保持位置同步更新
	f->m_HandPos.y=yPos;
	switch(f->m_eMove){
	case ENONE:	
		xPos=f->m_pBoard->m_joinPt[48].x;
		yPos=f->m_pBoard->m_joinPt[48].y;
		break;
	case EUP:
		if(m_bUp){			
			yPos-=f->m_pBoard->m_nChessBoardSize;
			m_bUp=FALSE;
		}
		if(yPos<f->m_pBoard->m_joinPt[0].y)
			yPos=f->m_pBoard->m_joinPt[0].y;
		break;
	case EDOWN:
		if(m_bDown){
			yPos+=f->m_pBoard->m_nChessBoardSize;
			m_bDown=FALSE;
		}
		if(yPos>f->m_pBoard->m_joinPt[89].y)
			yPos=f->m_pBoard->m_joinPt[89].y;
		break;
	case ELEFT:
		if(m_bLeft){
		xPos-=f->m_pBoard->m_nChessBoardSize;
			m_bLeft=FALSE;
		}
		if(xPos<f->m_pBoard->m_joinPt[0].x)
			xPos=f->m_pBoard->m_joinPt[0].x;
		break;
	case ERIGHT:
		if(m_bRight){
			xPos+=f->m_pBoard->m_nChessBoardSize;
			m_bRight=FALSE;
		}
		if(xPos>f->m_pBoard->m_joinPt[89].x)
			xPos=f->m_pBoard->m_joinPt[89].x;
		break;
	}
	if(f->m_bShowRect){	
		SETAEERECT(&handRect,(xPos-f->m_pBoard->m_nChessBoardSize/2),(yPos-f->m_pBoard->m_nChessBoardSize/2),f->m_pBoard->m_nChessBoardSize,f->m_pBoard->m_nChessBoardSize);
		paintCounter ++;
		if(paintCounter%3==0){
			clrRGB=MAKE_RGB(7,200, 216);
		}else if(paintCounter%3==1){
			clrRGB=MAKE_RGB(255,255, 255);
		}else{
			clrRGB=MAKE_RGB(49,216, 13);
		}
		if(paintCounter>10)
			paintCounter=0;
		IDISPLAY_DrawRect(d,&handRect, clrRGB,clrRGB,IDF_RECT_FRAME);
		IDISPLAY_Update(d);
	}
	if(pHand==NULL){
		CreateBitmap(d,&pHand,f->m_handcx,f->m_handcy);
		IBITMAP_BltIn(pHand,0,0,f->m_handcx,f->m_handcy,f->m_pHand,0,0,AEE_RO_COPY);
	}
	IDISPLAY_BitBlt(d, xPos,yPos,f->m_handcx,f->m_handcy ,(void*)pHand,0,0,AEE_RO_TRANSPARENT);
	IDISPLAY_Update(d);	
	return;
}


void CBrewGameCanvas::DrawRect(IDisplay *d)
{
	CBrewGame *f = (CBrewGame *)frame;
	RGBVAL clrRGB;
	AEERect rect;
	int i;
	if(f->m_bShowOppRect&&f->m_bMyturn)
		i=f->m_OppEndPos.x+9*f->m_OppEndPos.y;
	else if((f->m_setupCnt!=0)&&(f->m_bChessCanMove)&&(f->m_bMyturn==FALSE))
		i=f->m_EndPos.x+9*f->m_EndPos.y;
	else 
		return;
	SETAEERECT(&rect,(f->m_pBoard->m_joinPt[i].x-f->m_pBoard->m_nChessBoardSize/2),(f->m_pBoard->m_joinPt[i].y-f->m_pBoard->m_nChessBoardSize/2),f->m_pBoard->m_nChessBoardSize,f->m_pBoard->m_nChessBoardSize);
	paintCounter ++;
	if(paintCounter%3==0){
		clrRGB=MAKE_RGB(0,0, 255);
	}else if(paintCounter%3==1){
		clrRGB=MAKE_RGB(0,255, 0);
	}else{
		clrRGB=MAKE_RGB(255,0, 0);
	}
	if(paintCounter>10)
		paintCounter=0;
	IDISPLAY_DrawRect(d,&rect, clrRGB,clrRGB,IDF_RECT_FRAME);
	IDISPLAY_Update(d);	
	return;
}

void CBrewGameCanvas::DrawClock(IDisplay *d){
	CBrewGame *f = (CBrewGame *)frame;
	AECHAR szMsgText[16],szText[13];
	int  minute,ten,second,i;
	UINT32 time;
	if(f->m_bGameStart&&f->m_bShowClock&&f->m_bMyturn){//7-20显示倒计时
		time=ISHELL_GetUpTimeMS(f->m_pIShell);
		szMsgText[0]='%';
		szMsgText[1]='d';
		szMsgText[2]=':';
		szMsgText[3]='%';
		szMsgText[4]='d';
		szMsgText[5]='%';
		szMsgText[6]='d';
		szMsgText[7]='\0';
		minute=f->m_sChessState.m_turnClock/60;
		ten=f->m_sChessState.m_turnClock%60/10;
		second=f->m_sChessState.m_turnClock%60%10;
		WSPRINTF(&szMsgText[8],16,szMsgText,minute,ten,second);
		MEMSET(szText,'\0',26);
		ISHELL_LoadResString(f->m_pIShell,GAMEVV_RES_FILE,IDC_MYTURN,szText,12);
		WSTRCAT(szText,&szMsgText[8]);
		if(((time-f->m_clock)/1000)>0){
			f->m_sChessState.m_turnClock-=1;
			f->m_clock=time;
		}
		f->frame->showHint(szText,f->m_sChessState.m_turnClock,HINT_TOP|HINT_FIX|HINT_TEXT_CENTER);
	}else if(f->m_bGameStart&&(!f->m_bMyturn)&&(f->m_nGameState!=GAME_STATE_MAINMENU)&&(f->m_nGameState!=GAME_STATE_MENU)){
		MEMSET(szText,'\0',26);
		ISHELL_LoadResString(f->m_pIShell,GAMEVV_RES_FILE,IDC_OPPTHINK,szText,14);
		f->frame->showHint(szText,f->m_sChessState.m_turnClock,HINT_BOTTOM|HINT_TEXT_CENTER);
	}
	i=f->m_sChessState.m_ChessState&0x0F;
	if(f->m_sChessState.m_turnClock==0||(!f->m_bMyturn)){
		f->m_bShowClock=FALSE;
		f->m_clock=0;
		m_bClockJust=FALSE;
	}
	if(m_bClockJust==FALSE){
		if((i==2)||(i==3)||(i==4)){
			m_bClockJust=TRUE;
		}
	}
	return;	
}
 
boolean CBrewGameCanvas::CreateBitmap(IDisplay *d,IBitmap **ppIBitmap, UINT16 w, UINT16 h)
{
	IBitmap* pDeviceBitmap;
	NativeColor color;
	if(IDISPLAY_GetDeviceBitmap(d, &pDeviceBitmap ) != SUCCESS )
		return FALSE;	
	if(IBITMAP_CreateCompatibleBitmap( pDeviceBitmap, ppIBitmap,w,h) != SUCCESS ){
		IBITMAP_Release( pDeviceBitmap );
		return FALSE;
	}
	color =  IBITMAP_RGBToNative(*ppIBitmap, MAKE_RGB(255,0,255));
	IBITMAP_SetTransparencyColor(*ppIBitmap, color);	
	IBITMAP_Release( pDeviceBitmap );
	return TRUE;
}

⌨️ 快捷键说明

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