📄 cmapeditor.cpp
字号:
m_adwSurfaceHeight[9]=640;
m_adwSurfaceHeight[10]=480; //AniTileSurface
m_adwSurfaceColorKey[0]=RGB(255,0,255);
m_adwSurfaceColorKey[1]=RGB(0,0,0);
m_adwSurfaceColorKey[2]=RGB(255,0,255);
m_adwSurfaceColorKey[3]=RGB(255,0,255);
m_adwSurfaceColorKey[4]=RGB(255,0,255);
m_adwSurfaceColorKey[5]=RGB(255,0,255);
m_adwSurfaceColorKey[6]=RGB(255,0,255);
m_adwSurfaceColorKey[7]=RGB(255,0,255);
m_adwSurfaceColorKey[8]=RGB(0,0,0);
m_adwSurfaceColorKey[9]=RGB(255,0,255);
m_adwSurfaceColorKey[10]=RGB(255,0,255);
}
//-----------------------------------------------------------------------------------
//初始化表面
//-----------------------------------------------------------------------------------
BOOL CMapEditor::InitSurface(const char*szAniFile)
{
SetSurfaceValue();
char szBmpFile[1024];
if(FAILED(m_pDisplay->CreateSurface(&m_pSurfGround,640,480)))
{
m_pLog->WriteMessage("Create Surface Ground...failed!\n");
return false;
}
m_pSurfGround->SetColorKey(RGB(255,0,255));
m_pLog->WriteMessage("Create Surface Ground...ok!\n");
if(FAILED(m_pDisplay->CreateSurfaceFromBitmap(&m_pSurfBlock,"block.bmp",32,32)))
{
m_pLog->WriteMessage("Create Surface Block...failed!\n");
return false;
}
m_pSurfBlock->SetColorKey(RGB(255,255,255));
m_pLog->WriteMessage("Create Surface Block...ok!\n");
for(DWORD i=0;i<10;i++)
{
memset(szBmpFile,0,1024);
wsprintf(szBmpFile,"tiles\\tile%d.bmp",i);
if(FAILED(m_pDisplay->CreateSurfaceFromBitmap(&m_aSurface[i],
szBmpFile,
0,//m_adwSurfaceWidth[i],
0)))//m_adwSurfaceHeight[i])))
{
m_pLog->WriteMessage("Create Surface(%d) from File<%s> Failed!\n",i,szBmpFile);
return false;
}
m_pLog->WriteMessage("Create Surface(%d) from File<%s>...ok!\n",i,szBmpFile);
m_aSurface[i]->SetColorKey(m_adwSurfaceColorKey[i]);
}
if(FAILED(m_pDisplay->CreateSurface(&m_aSurface[10],
m_adwSurfaceWidth[10],
m_adwSurfaceHeight[10])))
{
m_pLog->WriteMessage("Create Surface(10) (AniSurface) Failed!\n");
return false;
}
m_aSurface[10]->SetColorKey(m_adwSurfaceColorKey[10]);
m_pLog->WriteMessage("Create Surface(10) (AniSurface)...ok!\n");
m_dwTileAniCount=::GetPrivateProfileInt("ani","count",0,szAniFile);
m_pLog->WriteMessage("Get Map Ani Tile Count=%d From<%s>\n",m_dwTileAniCount,szAniFile);
if(m_dwTileAniCount==0)
return true;
m_aTileAni=new STTileAni[m_dwTileAniCount];
if(!m_aTileAni)
{
m_pLog->WriteMessage("New Tile Ani Failed!\n");
return false;
}
int k,n;
char szAppName[256];
char szPosition[1024];
for(i=0;i<m_dwTileAniCount;i++)
{
memset(szAppName,0,256);
wsprintf(szAppName,"tile%d",i+1);
m_aTileAni[i].dwDelay=::GetPrivateProfileInt(szAppName,"delay",200,szAniFile);
m_aTileAni[i].dwFrames=::GetPrivateProfileInt(szAppName,"frames",0,szAniFile);
m_aTileAni[i].dwPicID=::GetPrivateProfileInt(szAppName,"picid",0,szAniFile);
m_aTileAni[i].dwCurrentFrame=0;
m_aTileAni[i].dwOldTime=0;
m_aTileAni[i].pPos=new POINT[m_aTileAni[i].dwFrames];
if(!m_aTileAni[i].pPos)
{
m_pLog->WriteMessage("New Tile Ani Position Failed!\n");
return false;
}
memset(szPosition,0,1024);
::GetPrivateProfileString(szAppName,"posx","",szPosition,1024,szAniFile);
for(DWORD j=0;j<m_aTileAni[i].dwFrames;j++)
{
m_aTileAni[i].pPos[j].x=0;
m_aTileAni[i].pPos[j].y=0;
}
k=0;
n=0;
char tmp[32];
while(szPosition[k])
{
j=0;
memset(tmp,0,32);
while(szPosition[k]!=',' && szPosition[k]!='\0')
{
tmp[j++]=szPosition[k];
k++;
}
if(tmp[j]==',')
tmp[j]='\0';
k++;
sscanf(tmp,"%d",&m_aTileAni[i].pPos[n].x);
n++;
}
memset(szPosition,0,1024);
::GetPrivateProfileString(szAppName,"posy","",szPosition,1024,szAniFile);
k=0;
n=0;
while(szPosition[k])
{
j=0;
memset(tmp,0,32);
while(szPosition[k]!=',' && szPosition[k]!='\0')
{
tmp[j++]=szPosition[k];
k++;
}
if(tmp[j]==',')
tmp[j]='\0';
k++;
sscanf(tmp,"%d",&m_aTileAni[i].pPos[n].y);
n++;
}
}
m_pLog->WriteMessage("Init Surface...OK!\n");
return true;
}
//-----------------------------------------------------------------------------------
//显示动态图块
//-----------------------------------------------------------------------------------
void CMapEditor::ShowAniTileToAniSurface()
{
RECT rect;
for(DWORD i=0;i<m_dwTileAniCount;i++)
{
if(timeGetTime()-m_aTileAni[i].dwOldTime > m_aTileAni[i].dwDelay)
{
m_aTileAni[i].dwOldTime=timeGetTime();
::SetRect(&rect,
m_aTileAni[i].pPos[m_aTileAni[i].dwCurrentFrame].x<<5,
m_aTileAni[i].pPos[m_aTileAni[i].dwCurrentFrame].y<<5,
(m_aTileAni[i].pPos[m_aTileAni[i].dwCurrentFrame].x+1)<<5,
(m_aTileAni[i].pPos[m_aTileAni[i].dwCurrentFrame].y+1)<<5);
m_aSurface[10]->BltFast((i%20)<<5,
(i/20)<<5,
m_aSurface[ m_aTileAni[i].dwPicID],
&rect,true);
m_aTileAni[i].dwCurrentFrame++;
if(m_aTileAni[i].dwCurrentFrame>=m_aTileAni[i].dwFrames)
m_aTileAni[i].dwCurrentFrame=0;
}
}
}
//-----------------------------------------------------------------------------------
//显示选择图块的表面
//-----------------------------------------------------------------------------------
void CMapEditor::ShowSelectTileSurface()
{
RECT rect={m_axSelectStart[m_dwCurrentSelectSurface],
m_aySelectStart[m_dwCurrentSelectSurface],
m_axSelectStart[m_dwCurrentSelectSurface]+640,
m_aySelectStart[m_dwCurrentSelectSurface]+480};
m_pDisplay->ColorKeyBlt(0,0,
m_aSurface[m_dwCurrentSelectSurface]->GetDDrawSurface(),
&rect);
}
//-----------------------------------------------------------------------------------
//显示地表
//-----------------------------------------------------------------------------------
void CMapEditor::ShowGround()
{
if(!m_bShowGround)
return;
m_pDisplay->ColorKeyBlt(0,0,m_pSurfGround->GetDDrawSurface());
}
//-----------------------------------------------------------------------------------
//显示编辑表面
//-----------------------------------------------------------------------------------
void CMapEditor::ShowEditSurface()
{
ShowGround();
if(!m_pMap->m_ppTile)
return;
RECT rect;
for(DWORD x=0,i=m_xEditStart>>5;i<(m_xEditStart>>5)+20;i++,x++)
{
for(DWORD y=0,j=m_yEditStart>>5;j<(m_yEditStart>>5)+15;j++,y++)
{
if(m_pMap->m_ppTile[i][j].IDObj_1!=255 && m_bShowObj1)
{
::SetRect(&rect,((DWORD)(m_pMap->m_ppTile[i][j].xObj_1))<<5,
((DWORD)(m_pMap->m_ppTile[i][j].yObj_1))<<5,
((DWORD)(m_pMap->m_ppTile[i][j].xObj_1)+1)<<5,
((DWORD)(m_pMap->m_ppTile[i][j].yObj_1)+1)<<5);
m_pDisplay->ColorKeyBlt(x<<5,y<<5,
m_aSurface[m_pMap->m_ppTile[i][j].IDObj_1]->GetDDrawSurface(),
&rect);
}
if(m_pMap->m_ppTile[i][j].IDObj_2!=255 && m_bShowObj2)
{
::SetRect(&rect,((DWORD)(m_pMap->m_ppTile[i][j].xObj_2))<<5,
((DWORD)(m_pMap->m_ppTile[i][j].yObj_2))<<5,
((DWORD)(m_pMap->m_ppTile[i][j].xObj_2)+1)<<5,
((DWORD)(m_pMap->m_ppTile[i][j].yObj_2)+1)<<5);
m_pDisplay->ColorKeyBlt(x<<5,y<<5,
m_aSurface[m_pMap->m_ppTile[i][j].IDObj_2]->GetDDrawSurface(),
&rect);
}
if(m_bShowBlockSign && false==m_pMap->m_ppTile[i][j].bCross)
m_pDisplay->ColorKeyBlt(x<<5,y<<5,m_pSurfBlock->GetDDrawSurface());
}
}
}
//-----------------------------------------------------------------------------------
//显示格子
//-----------------------------------------------------------------------------------
void CMapEditor::ShowGrid()
{
if(!m_bShowGrid)
return;
HDC hdc;
m_pDisplay->GetBackBuffer()->GetDC(&hdc);
HPEN hpen=::CreatePen(1,1,RGB(0,255,0));
::SelectObject(hdc,(HGDIOBJ)hpen);
for(int i=0;i<20;i++)
{
::MoveToEx(hdc,i<<5,0,NULL);
::LineTo(hdc,i<<5,480);
}
for(i=0;i<15;i++)
{
::MoveToEx(hdc,0,i<<5,NULL);
::LineTo(hdc,640,i<<5);
}
::DeleteObject(hpen);
m_pDisplay->GetBackBuffer()->ReleaseDC(hdc);
}
//-----------------------------------------------------------------------------------
//刷新屏幕
//-----------------------------------------------------------------------------------
void CMapEditor::UpdateScreen()
{
m_pDisplay->Clear();
ShowAniTileToAniSurface();
POINT pt;
RECT rect;
::GetCursorPos(&pt);
::ScreenToClient(m_hWnd,&pt);
::GetClientRect(m_hWnd,&rect);
float tileWidth=((float)(rect.right-rect.left))/20.0f;
float tileHeight=((float)(rect.bottom-rect.top))/15.0f;
if(m_bIsEdit)
{
if(::PtInRect(&rect,pt))
{
m_xdwCurrentEditTile=(DWORD)(((float)(pt.x))/tileWidth);
m_ydwCurrentEditTile=(DWORD)(((float)(pt.y))/tileHeight);
}
ShowEditSurface();
if(m_xdwCurrentSelectTile!=0xffffffff
&& m_ydwCurrentSelectTile!=0xffffffff)
{
::SetRect(&rect,m_xdwCurrentSelectTile<<5,
m_ydwCurrentSelectTile<<5,
(m_xdwCurrentSelectTile+1)<<5,
(m_ydwCurrentSelectTile+1)<<5);
m_pDisplay->AlphaBlt(
m_xdwCurrentEditTile<<5,
m_ydwCurrentEditTile<<5,
m_aSurface[m_dwCurrentSelectSurface]->GetDDrawSurface(),
&rect,true,8);
}
}
else
{
ShowSelectTileSurface();
DWORD TempX,TempY;
if(::PtInRect(&rect,pt))
{
TempX=(DWORD)(((float)(pt.x))/tileWidth);
TempY=(DWORD)(((float)(pt.y))/tileHeight);
::SetRect(&rect,TempX<<5,
TempY<<5,
(TempX+1)<<5,
(TempY+1)<<5);
m_pDisplay->ColorAlphaBlt(RGB(255,0,255),&rect,16);
}
}
ShowGrid();
static DWORD fpsoldTime=timeGetTime();
static int frames=0,fps=0;
if(timeGetTime()-fpsoldTime<1000)
{
frames++;
}
else
{
fpsoldTime=timeGetTime();
fps=frames;
frames=0;
}
char tmp[64];
memset(tmp,0,64);
wsprintf(tmp,"fps:%d",fps);
HDC hdc;
m_pDisplay->GetBackBuffer()->GetDC(&hdc);
SetTextColor(hdc,RGB(255,255,255));
SetBkMode(hdc,TRANSPARENT);
::TextOut(hdc,10,10,tmp,strlen(tmp));
char editstat[32];
memset(editstat,0,32);
if(this->m_bIsEdit)
{
if(this->m_dwCurrentEditLayer==LOA_MAP_LAYER_GROUND)
wsprintf(editstat,"地表层");
else if(this->m_dwCurrentEditLayer==LOA_MAP_LAYER_OBJ_1)
wsprintf(editstat,"物体层1");
else
wsprintf(editstat,"物体层2");
}
else
{
wsprintf(editstat,"选择图块");
}
char strRndBattle[32];
if(m_pMap)
{
if(m_pMap->m_head.bRandomBattle==1)
strcpy(strRndBattle,"是");
else
strcpy(strRndBattle,"否");
}
else
{
strcpy(strRndBattle,"否");
}
wsprintf(tmp,"地图大小:%d,%d 是否允许随机战斗:%s 当前编辑:%d,%d,编辑状态:%s",
this->s_dwNewMapWidth,this->s_dwNewMapHeight,
strRndBattle,
this->m_xdwCurrentEditTile+(this->m_xEditStart>>5),
this->m_ydwCurrentEditTile+(this->m_yEditStart>>5),
editstat);
::TextOut(hdc,10,30,tmp,strlen(tmp));
wsprintf(tmp,"鼠标在客户区的坐标:%d,%d",pt.x,pt.y);
::TextOut(hdc,10,50,tmp,strlen(tmp));
m_pDisplay->GetBackBuffer()->ReleaseDC(hdc);
m_pDisplay->Present();
}
//-----------------------------------------------------------------------------------
//主循环
//-----------------------------------------------------------------------------------
int CMapEditor::MainLoop()
{
if(!InitSurface("tiles\\ani.ini"))
return false;
m_pMap=new CMap(m_pLog);
if(!m_pMap)
{
m_pLog->WriteMessage("New CMap Failed!\n");
return false;
}
if(!m_pMap->NewMap(40,30))
{
m_pLog->WriteMessage("New Map Failed!\n");
return false;
}
SendMessage(m_hWnd,UM_SETCLASS,(WPARAM)this,0);
MSG msg;
HACCEL hAccelTable;
hAccelTable=::LoadAccelerators(m_hInstance,MAKEINTRESOURCE(IDR_ACC));
while(1)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return msg.wParam;
if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else if(m_bActive)
{
OnMouseMove();
UpdateScreen();
}
else
WaitMessage();
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -