VC++ C++ C# Algorithm

C++博客 首页 新随笔 联系 聚合 管理
  21 Posts :: 3 Stories :: 31 Comments :: 0 Trackbacks

精灵页是保存在一个图像文件上的所有图片。如果你想处理很多图片,但又不想处理很多图像文件的话是非常有用的。你可以在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

posted on 2007-03-10 21:14 大熊猫 阅读(421) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理