📄 isoscroller.cpp
字号:
//isoscroller.cpp
#include "IsoScroller.h"
//constructor
CScroller::CScroller()
{
//set all spaces to empty
SetRectEmpty(&rcWorldSpace);
SetRectEmpty(&rcScreenSpace);
SetRectEmpty(&rcAnchorSpace);
//set screen anchor to 0,0
ptScreenAnchor.x=0;
ptScreenAnchor.y=0;
//set wrapping modes to none
SetHWrapMode(WRAPMODE_NONE);
SetVWrapMode(WRAPMODE_NONE);
}
//destructor
CScroller::~CScroller()
{
}
//screen space
//get screenspace
RECT* CScroller::GetScreenSpace()
{
//return pointer to rect
return(&rcScreenSpace);
}
//set screenspace
void CScroller::SetScreenSpace(RECT* prcNewScreenSpace)
{
//copy rectangle
CopyRect(&rcScreenSpace,prcNewScreenSpace);
}
//change screenspace
void CScroller::AdjustScreenSpace(int iLeftAdjust,int iTopAdjust,int iRightAdjust, int iBottomAdjust)
{
//adjust left
rcScreenSpace.left+=iLeftAdjust;
//adjust top
rcScreenSpace.top+=iTopAdjust;
//adjust right
rcScreenSpace.right+=iRightAdjust;
//adjust bottom
rcScreenSpace.bottom+=iBottomAdjust;
}
//retrieve width of screenspace
int CScroller::GetScreenSpaceWidth()
{
//return width of rect
return(rcScreenSpace.right-rcScreenSpace.left);
}
//retrieve height of screenspace
int CScroller::GetScreenSpaceHeight()
{
//return height of rect
return(rcScreenSpace.bottom-rcScreenSpace.top);
}
//world space
//get worldspace
RECT* CScroller::GetWorldSpace()
{
//return pointer to rect
return(&rcWorldSpace);
}
//set worldspace
void CScroller::SetWorldSpace(RECT* prcNewWorldSpace)
{
//copy rectangle
CopyRect(&rcWorldSpace,prcNewWorldSpace);
}
//change worldspace
void CScroller::AdjustWorldSpace(int iLeftAdjust,int iTopAdjust,int iRightAdjust, int iBottomAdjust)
{
//adjust left
rcWorldSpace.left+=iLeftAdjust;
//adjust top
rcWorldSpace.top+=iTopAdjust;
//adjust right
rcWorldSpace.right+=iRightAdjust;
//adjust bottom
rcWorldSpace.bottom+=iBottomAdjust;
}
//retrieve width of worldspace
int CScroller::GetWorldSpaceWidth()
{
//return width of rect
return(rcWorldSpace.right-rcWorldSpace.left);
}
//retrieve height of worldspace
int CScroller::GetWorldSpaceHeight()
{
//return height of rect
return(rcWorldSpace.bottom-rcWorldSpace.top);
}
//calc worldspace based on a tileplotter and map width and height
void CScroller::CalcWorldSpace(CTilePlotter* TilePlotter,RECT* prcExtent,int iMapWidth,int iMapHeight)
{
//set worldspace rect to empty
SetRectEmpty(&rcWorldSpace);
//temporary rectangle
RECT rcTemp;
CopyRect(&rcTemp,prcExtent);
//point for plotting
POINT ptPlot;
//map point
POINT ptMap;
//loop through map positions
for(ptMap.x=0;ptMap.x<iMapWidth;ptMap.x++)
{
for(ptMap.y=0;ptMap.y<iMapHeight;ptMap.y++)
{
//plot the map point
ptPlot=TilePlotter->PlotTile(ptMap);
//adjust the temp rect
OffsetRect(&rcTemp,ptPlot.x,ptPlot.y);
//expand the boundaries of worldspace
//left
if(rcTemp.left<rcWorldSpace.left) rcWorldSpace.left=rcTemp.left;
//top
if(rcTemp.top<rcWorldSpace.top) rcWorldSpace.top=rcTemp.top;
//right
if(rcTemp.right>rcWorldSpace.right) rcWorldSpace.right=rcTemp.right;
//bottom
if(rcTemp.bottom>rcWorldSpace.bottom) rcWorldSpace.bottom=rcTemp.bottom;
//adjust the temp rect back
OffsetRect(&rcTemp,-ptPlot.x,-ptPlot.y);
}
}
}
//anchor space
//get anchorspace
RECT* CScroller::GetAnchorSpace()
{
//return pointer to rect
return(&rcAnchorSpace);
}
//set anchorspace
void CScroller::SetAnchorSpace(RECT* prcNewAnchorSpace)
{
//copy rectangle
CopyRect(&rcAnchorSpace,prcNewAnchorSpace);
}
//change anchorspace
void CScroller::AdjustAnchorSpace(int iLeftAdjust,int iTopAdjust,int iRightAdjust, int iBottomAdjust)
{
//adjust left
rcAnchorSpace.left+=iLeftAdjust;
//adjust top
rcAnchorSpace.top+=iTopAdjust;
//adjust right
rcAnchorSpace.right+=iRightAdjust;
//adjust bottom
rcAnchorSpace.bottom+=iBottomAdjust;
}
//retrieve width of anchorspace
int CScroller::GetAnchorSpaceWidth()
{
//return width of rect
return(rcAnchorSpace.right-rcAnchorSpace.left);
}
//retrieve height of anchorspace
int CScroller::GetAnchorSpaceHeight()
{
//return height of rect
return(rcAnchorSpace.bottom-rcAnchorSpace.top);
}
//calculates anchor space based on world space and screen space
void CScroller::CalcAnchorSpace()
{
//copy worldspace
CopyRect(&rcAnchorSpace,&rcWorldSpace);
//subtract out screen space
if(GetHWrapMode()!=WRAPMODE_WRAP) rcAnchorSpace.right-=GetScreenSpaceWidth();
if(GetVWrapMode()!=WRAPMODE_WRAP) rcAnchorSpace.bottom-=GetScreenSpaceHeight();
//make sure right!<left and bottom !<top
if(rcAnchorSpace.right<=rcAnchorSpace.left) rcAnchorSpace.right=rcAnchorSpace.left+1;
if(rcAnchorSpace.bottom<=rcAnchorSpace.top) rcAnchorSpace.bottom=rcAnchorSpace.top+1;
}
//anchor
//retrieve anchor
POINT* CScroller::GetAnchor()
{
//return screen anchor
return(&ptScreenAnchor);
}
//set anchor
void CScroller::SetAnchor(POINT* pptNewAnchor,bool bWrap)
{
//copy position
ptScreenAnchor.x=pptNewAnchor->x;
ptScreenAnchor.y=pptNewAnchor->y;
//optionally apply wrapping mode
if(bWrap) WrapAnchor();
}
//move anchor
void CScroller::MoveAnchor(int iXAdjust,int iYAdjust,bool bWrap)
{
//adjust screen anchor
ptScreenAnchor.x+=iXAdjust;
ptScreenAnchor.y+=iYAdjust;
//optionally wrap/clip anchor
if(bWrap) WrapAnchor();
}
//apply wrapmode to anchor
void CScroller::WrapAnchor()
{
//horizontal wrapping
switch(swmHorizontal)
{
case WRAPMODE_CLIP:
{
//clip to left
if(ptScreenAnchor.x<rcAnchorSpace.left) ptScreenAnchor.x=rcAnchorSpace.left;
//clip to right
if(ptScreenAnchor.x>=rcAnchorSpace.right) ptScreenAnchor.x=rcAnchorSpace.right-1;
}break;
case WRAPMODE_WRAP:
{
//left wrapping
while(ptScreenAnchor.x<rcAnchorSpace.left) ptScreenAnchor.x+=GetAnchorSpaceWidth();
//right wrapping
while(ptScreenAnchor.x>=rcAnchorSpace.right) ptScreenAnchor.x-=GetAnchorSpaceWidth();
}break;
}
//vertical wrapping
switch(swmVertical)
{
case WRAPMODE_CLIP:
{
//clip to top
if(ptScreenAnchor.y<rcAnchorSpace.top) ptScreenAnchor.y=rcAnchorSpace.top;
//clip to bottom
if(ptScreenAnchor.y>=rcAnchorSpace.bottom) ptScreenAnchor.y=rcAnchorSpace.bottom-1;
}break;
case WRAPMODE_WRAP:
{
//top wrapping
while(ptScreenAnchor.y<rcAnchorSpace.top) ptScreenAnchor.y+=GetAnchorSpaceWidth();
//bottom wrapping
while(ptScreenAnchor.y>=rcAnchorSpace.bottom) ptScreenAnchor.y-=GetAnchorSpaceWidth();
}break;
}
}
//conversion
//screen->world
POINT CScroller::ScreenToWorld(POINT ptScreen)
{
//translate into plotspace coordinates
ptScreen.x-=rcScreenSpace.left;
ptScreen.y-=rcScreenSpace.top;
//translate into world coordinates
ptScreen.x+=ptScreenAnchor.x;
ptScreen.y+=ptScreenAnchor.y;
//return coordinates
return(ptScreen);
}
//world->screen
POINT CScroller::WorldToScreen(POINT ptWorld)
{
//translate into plotspace coordinates
ptWorld.x-=ptScreenAnchor.x;
ptWorld.y-=ptScreenAnchor.y;
//translate into screen coordinates
ptWorld.x+=rcScreenSpace.left;
ptWorld.y+=rcScreenSpace.top;
//return cooridinates
return(ptWorld);
}
//wrap modes
//setters
//horizontal
void CScroller::SetHWrapMode(SCROLLERWRAPMODE ScrollerWrapMode)
{
//set wrap mode
swmHorizontal=ScrollerWrapMode;
}
//vertical
void CScroller::SetVWrapMode(SCROLLERWRAPMODE ScrollerWrapMode)
{
//set wrap mode
swmVertical=ScrollerWrapMode;
}
//getters
//horiz
SCROLLERWRAPMODE CScroller::GetHWrapMode()
{
//return wrap mode
return(swmHorizontal);
}
//vertical
SCROLLERWRAPMODE CScroller::GetVWrapMode()
{
//return wrap mode
return(swmVertical);
}
//validation
//world
bool CScroller::IsWorldCoord(POINT ptWorld)
{
//check for valid coordinate
return(PtInRect(&rcWorldSpace,ptWorld)!=FALSE);
}
//screen
bool CScroller::IsScreenCoord(POINT ptScreen)
{
//check for valid coordinate
return(PtInRect(&rcScreenSpace,ptScreen)!=FALSE);
}
//anchor
bool CScroller::IsAnchorCoord(POINT ptAnchor)
{
//check for valid coordinate
return(PtInRect(&rcAnchorSpace,ptAnchor)!=FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -