SDL游戏编程(6)剪切与精灵页

SDL游戏编程(6)剪切与精灵页

精灵页是保存在一个图像文件上的所有图片。如果你想处理很多图片,但又不想处理很多图像文件的话是非常有用的。你可以在Blit的时候对一部分进行剪切,这样就能够得到单个的图片,下面我们就看看怎么样从一张精灵页上剪切一张图片。

// The surfaces
SDL_Surface  * dots  =  NULL;
SDL_Surface 
* screen  =  NULL;

// The event structure
SDL_Event  event ;

// The portions of the sprite map to be blitted
SDL_Rect clip[  4  ];

以上是一些全局的变量。屏幕表面,事件是我们看到过的。我们也有一个保存所有圆点精灵的表面,也就是精灵页。最后是定义了一个有四个元素的数组,它们将保存4个圆点精灵的偏移和尺寸。

void  apply_surface(  int  x,  int  y, SDL_Surface *  source, SDL_Surface *  destination, SDL_Rect *  clip  =  NULL )
{
    
// Holds offsets
    SDL_Rect offset;
    
    
// Get offsets
    offset.x  =  x;
    offset.y 
=  y;
    
    
// Blit
    SDL_BlitSurface( source, clip, destination,  & offset );
}

以上是我们的Blit函数,比起前几篇教程的函数略有不同。我们在函数中加了一个SDL_Rect参数,该参数传递我们要剪切的源表面的哪一部分表面。

    // Clip range for the top left
    clip[  0  ].x  =   0 ;
    clip[ 
0  ].y  =   0 ;
    clip[ 
0  ].w  =   100 ;
    clip[ 
0  ].h  =   100 ;
    
    
// Clip range for the top right
    clip[  1  ].x  =   100 ;
    clip[ 
1  ].y  =   0 ;
    clip[ 
1  ].w  =   100 ;
    clip[ 
1  ].h  =   100 ;
    
    
// Clip range for the bottom left
    clip[  2  ].x  =   0 ;
    clip[ 
2  ].y  =   100 ;
    clip[ 
2  ].w  =   100 ;
    clip[ 
2  ].h  =   100 ;
    
    
// Clip range for the bottom right
    clip[  3  ].x  =   100 ;
    clip[ 
3  ].y  =   100 ;
    clip[ 
3  ].w  =   100 ;
    clip[ 
3  ].h  =   100 ;


在主函数中,当所有的东西都准备就绪了,我们就开始设置一下剪切区域
假设我们要剪切如下的精灵页:

sheet.jpg
我们把要剪切的矩形设置成指定的区域。

 

现在我们用SDL_FillRect()函数把屏幕填充成白色,该函数有二个参数,第一个就是要填充的表面,第二个就是颜色了。

现在我们就开始Blit精灵,注意,我们每次Blit的源都是同一个,只是我们选取了不同的区域而已。

最后的结果就如下了。
result.jpg

你可能感兴趣的:(SDL游戏编程(6)剪切与精灵页)