📄 map.cpp
字号:
break;
case 4:
break;
case 5:
break;
case 6: //4,8
Redraw( WIN_WIDTH*2, 0, mapX-1, mapY-20, WIN_WIDTH/TILE_WIDTH/2, WIN_HEIGHT/TILE_HEIGHT*2 );
break;
case 7: //12,16
Redraw( WIN_WIDTH*2, WIN_HEIGHT - TILE_HEIGHT, mapX+9, mapY-10, WIN_WIDTH/TILE_WIDTH/2, WIN_HEIGHT/TILE_HEIGHT*2+1 );
status = NoRefresh;
break;
}
refreshStep ++;
}
void Cache::RefreshTopRight( void )
{
#ifdef DEBUG
OutDebugString( "RefreshTopRight" );
#endif
switch( refreshStep ){
case 0: // 移动块10,11,12到13,14,15
ground->Blit( ground, 0, WIN_HEIGHT*3/2 - TILE_HEIGHT, WIN_WIDTH/2, WIN_HEIGHT - TILE_HEIGHT/2, WIN_WIDTH*3/2, WIN_HEIGHT/2 );
break;
case 1: // 移动块2,6到5,9
ground->Blit( ground, 0, WIN_HEIGHT/2 - TILE_HEIGHT/2, WIN_WIDTH/2, 0, WIN_WIDTH/2, WIN_HEIGHT - TILE_HEIGHT/2 );
break;
case 2: // 移动块3,4,7,8到6,7,10,11
ground->Blit( ground, WIN_WIDTH/2, WIN_HEIGHT/2 - TILE_HEIGHT/2, WIN_WIDTH, 0, WIN_WIDTH, WIN_HEIGHT - TILE_HEIGHT/2 );
sceneX -= WIN_WIDTH/2;
sceneY += WIN_HEIGHT/2 - TILE_HEIGHT/2;
mapY -= WIN_WIDTH/TILE_WIDTH;
break;
case 3:
break;
case 4: //8
Redraw( WIN_WIDTH*2, WIN_HEIGHT/2 - TILE_HEIGHT/2, mapX+4, mapY-15, WIN_WIDTH/TILE_WIDTH/2, WIN_HEIGHT/TILE_HEIGHT+1 );
break;
case 5: //12,16
Redraw( WIN_WIDTH*2, WIN_HEIGHT - TILE_HEIGHT, mapX+9, mapY-10, WIN_WIDTH/TILE_WIDTH/2, WIN_HEIGHT/TILE_HEIGHT*2+1 );
break;
case 6: // 1,2
Redraw( WIN_WIDTH, 0, mapX-11, mapY-10, WIN_WIDTH/TILE_WIDTH, WIN_HEIGHT/TILE_HEIGHT );
break;
case 7: // 3,4
Redraw( WIN_WIDTH*2, 0, mapX-1, mapY-20, WIN_WIDTH/TILE_WIDTH, WIN_HEIGHT/TILE_HEIGHT );
status = NoRefresh;
break;
}
refreshStep ++;
}
void Cache::DrawGround( int deltax, int deltay )
{
if( ABS(deltax) >= WIN_WIDTH/2 || ABS(deltay) >= WIN_HEIGHT/2 )
;
sceneX += deltax;
sceneY += deltay;
if( status == NoRefresh ){
// 检查是否需要刷新cache.ground
if( sceneX <= TILE_WIDTH ){
if( sceneY <= TILE_HEIGHT * 2 )
status = InRefreshTopLeft;
else if( sceneY >= WIN_HEIGHT - TILE_HEIGHT - TILE_HEIGHT * 2 )
status = InRefreshBottomLeft;
else
status = InRefreshLeft;
}
else if( sceneX >= WIN_WIDTH - TILE_WIDTH ){
if( sceneY <= TILE_HEIGHT * 2 )
status = InRefreshTopRight;
else if( sceneY >= WIN_HEIGHT - TILE_HEIGHT - TILE_HEIGHT * 2 )
status = InRefreshBottomRight;
else
status = InRefreshRight;
}
else if( sceneY <= TILE_HEIGHT ){
if( sceneX <= TILE_WIDTH * 2 )
status = InRefreshTopLeft;
else if( sceneX >= WIN_WIDTH - TILE_WIDTH * 2 )
status = InRefreshTopRight;
else
status = InRefreshTop;
}
else if( sceneY >= WIN_HEIGHT - TILE_HEIGHT * 2 ){
if( sceneX <= TILE_WIDTH * 2 )
status = InRefreshBottomLeft;
else if( sceneX >= WIN_WIDTH - TILE_WIDTH * 2 )
status = InRefreshBottomRight;
else
status = InRefreshBottom;
}
refreshStep = 0;
}
if( status != NoRefresh )
switch( status ){
case InRefreshTop:
RefreshTop();
break;
case InRefreshTopLeft:
RefreshTopLeft();
break;
case InRefreshLeft:
RefreshLeft();
break;
case InRefreshBottomLeft:
RefreshBottomLeft();
break;
case InRefreshBottom:
RefreshBottom();
break;
case InRefreshBottomRight:
RefreshBottomRight();
break;
case InRefreshRight:
RefreshRight();
break;
case InRefreshTopRight:
RefreshTopRight();
break;
}
CopyGroundBrightnessMMX( sceneX, sceneY );
}
//mapx, mapy:主画面的中心在数组map中的下标
int Cache::InitCache( int level, int mapx, int mapy )
{
mapX = mapx;
mapY = mapy;
// 读入地面的图片
if( floor.LoadPicture( level ) != 0 )
return -1;
if( wallBase.LoadPicture( level ) != 0 )
return -1;
ground = CreateBitmap( WIN_WIDTH*2, WIN_HEIGHT*2 );
if( ground == NULL ) return -1;
Redraw( WIN_WIDTH*2, 0, mapx - 1, mapy - 20, WIN_WIDTH/TILE_WIDTH*2, WIN_HEIGHT/TILE_HEIGHT*4 - 2 );
refreshStep = 0;
sceneX = WIN_WIDTH/2;
sceneY = WIN_HEIGHT/2 - TILE_HEIGHT/2;
return 0;
}
/////////////////////////////////////////////////////////////////////
int Scene::InitScene( int level, int cx, int cy )
{
MapGenerate( );
if( cache.InitCache( level, 24, 24 ) != 0 )
return -1;
wall.LoadPicture( level ); //载入墙壁的图片
centerX = cx;
centerY = cy;
x = cx-1;
y = cy-10;
moveX = deltaX = 0;
moveY = deltaY = 0;
w = 10;
h = 22+6;
status = DIR_UNKNOWN;
refreshStep = 0;
return 0;
}
void Scene::UpdateStatus( int dir )
{
if( dir != DIR_UNKNOWN ){
if( status != DIR_UNKNOWN ){
if( dir != status )
FailMsg( "updatescene dir!=status" );
deltaX -= moveX;
deltaY -= moveY;
}
else{
refreshStep = 0;
status = dir;
switch( dir ){
case DIR_UP:
moveX = 0; moveY = -4 ;
x --; y --; h += 2;
deltaY = -32;
deltaY += 4;
break;
case DIR_UPLEFT:
moveX = -4; moveY = -2 ;
w ++; y --; h ++;
deltaX = 32; deltaY = -16;
deltaX += 4; deltaY += 2;
break;
case DIR_LEFT:
moveX = -8; moveY = 0 ;
w ++;
deltaX += 8;
break;
case DIR_DOWNLEFT:
moveX = -4; moveY = 2 ;
w ++; h ++;
deltaX += 4; deltaY -= 2;
break;
case DIR_DOWN:
moveX = 0; moveY = 4 ;
h += 2;
deltaY -= 4;
break;
case DIR_DOWNRIGHT:
moveX = 4; moveY = 2 ;
x ++; y --; w ++; h ++;
deltaX = 64;
deltaX -= 4; deltaY -= 2;
break;
case DIR_RIGHT:
moveX = 8; moveY = 0 ;
w ++; x ++; y --;
deltaX = 64;
deltaX -= 8;
break;
case DIR_UPRIGHT:
moveX = 4; moveY = -2;
y --; w ++; h ++;
deltaX = 32; deltaY = -16;
deltaX -= 4; deltaY += 2;
break;
}
}
refreshStep ++;
}
else{
moveX = moveY = 0;
}
}
void Scene::Update( void )
{
cache.DrawGround( moveX, moveY );
Draw();
if( refreshStep == 8 ){
refreshStep = 0;
deltaX = deltaY = 0;
switch( status ){
case DIR_UP:
h -= 2;
centerY --; centerX --;
break;
case DIR_UPLEFT:
x --; y ++; w --; h --;
centerX --;
break;
case DIR_LEFT:
w --;
x --; y ++;
centerY ++; centerX --;
break;
case DIR_DOWNLEFT:
y ++; w --; h --;
centerY ++;
break;
case DIR_DOWN:
x ++; y ++;
h -= 2;
centerY ++; centerX ++;
break;
case DIR_DOWNRIGHT:
y ++; w --; h --;
centerX ++;
break;
case DIR_RIGHT:
w --;
centerY --; centerX ++;
break;
case DIR_UPRIGHT:
w --; h --;
centerY --;
break;
}
status = DIR_UNKNOWN;
}
}
void Scene::Draw( )
{
//draw wall and sprites
backScreen->SetClip( 0, 0, WIN_WIDTH, WIN_HEIGHT );
int i, j, k, l, gx, gy;
gy = deltaY;
for( i=0; i<h; i++ ){
l = x + (i+1)/2;
k = y + i/2;
gx = (i%2) ? WIN_WIDTH+deltaX : WIN_WIDTH+deltaX - 32;
for( j=0; j<w+i%2; j++ ){
if( k >= 0 && l >= 0 && k < MAZE_SIZE && l < MAZE_SIZE )
if( maze[k][l].isWall ){ // wall
//OutDebugString( "draw wall" );
wall.Draw( backScreen, gx, gy, maze[k][l].plot );
}
else if( maze[k][l].sprite != 0 )
objects.DrawSprite( maze[k][l].sprite );
k ++;
l --;
gx -= 64;
}
gy += 16;
}
}
void Scene::SetCenter( int cx, int cy )
{
int dx, dy;
x = cx - 1;
y = cy - 10;
dx = cx - centerX;
dy = cy - centerY;
moveX = ( dx - dy ) * TILE_WIDTH/2 - refreshStep * moveX;
moveY = ( dx + dy ) * TILE_HEIGHT/2 - refreshStep * moveY;
centerX = cx;
centerY = cy;
deltaX = deltaY = 0;
status = 0;
}
static char off_map[32][64] = {
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1 },
{ 0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1 },
{ 0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1 },
{ 0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1 },
{ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 },
{ 3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4 },
{ 3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4 },
{ 3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 },
{ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 },
};
void Scene::PixelToPlot( int mx, int my, int *px, int *py )
{
int tx, ty;
signed char xoff[5] = { -1, 0, 0, 0, 1};
signed char yoff[5] = { 0, -1, 0, 1, 0};
mx = mx + moveX*refreshStep;
my = my + moveY*refreshStep + TILE_HEIGHT/2;
tx = mx / TILE_WIDTH;
ty = my / TILE_HEIGHT;
*px = tx + ty;
*py = ty - tx;
mx &= 63;
my &= 31;
*px += xoff[off_map[my][mx]] + centerX - 10;
*py += yoff[off_map[my][mx]] + centerY - 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -