📄 brewgamecanvas.cpp
字号:
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 + -