随笔 - 96  文章 - 255  trackbacks - 0
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

E-mail:zbln426@163.com QQ:85132383 长期寻找对战略游戏感兴趣的合作伙伴。

常用链接

留言簿(21)

随笔分类

随笔档案

SDL相关网站

我的个人网页

我的小游戏

资源下载

搜索

  •  

积分与排名

  • 积分 - 484569
  • 排名 - 37

最新评论

阅读排行榜

评论排行榜

作者:龙飞

3.1:矩形区域SDL_Rect。
typedef struct{
  Sint16 x, y;
  Uint16 w, h;
} SDL_Rect;
        因为显示器通常是矩形的,所以,矩形是计算机图形学中最基本的操作区域单元。这个结构很简单,x和y是矩形的左上角坐标。x从左到右增加;y从上到下增加。左上角的坐标就是(0,0)——SDL中就是这样的。w是矩形的宽,h是矩形的高。

3.2:进一步了解SDL_BlitSurface()。
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
        4个参数都是指针——2个SDL_Surface指针,2个SDL_Rect指针。src是源面,也就是被blit的面;dst是目的面,也就是源面被blit到的面。srcrect是源面上的一个矩形区域,实际上,正是这个矩形区域被blit,如果是空指针,则整个源面被blit;dstrect虽然是个矩形区域指针,但是实际上只用到了这个矩形左上角坐标的数据。所以,实际上,它是源面被blit到目的面上的坐标。如果是空指针,则被blit到目的面的左上角(0,0)。

3.3:为surface类增加新的方法。
class DisplaySurface
{
public:
    
bool blit(int at_x, int at_y) const;
    
bool blit(int at_x, int at_y, int from_x, int from_y, int w, int h, int delta_x = 2int delta_y = 2const;
};
我们重载了blit()方法。
bool DisplaySurface::blit(int at_x, int at_y) const
{
    SDL_Rect offset;
    offset.x 
= at_x;
    offset.y 
= at_y;

    
if ( SDL_BlitSurface(pSurface, 0, pScreen, &offset) < 0 )
        
return false;
    
else return true;
}
这个方法,让整个源面被blit到目的面的(at_x,at_y)坐标上。
bool DisplaySurface::blit(int at_x, int at_y,
                          
int from_x, int from_y, int w, int h,
                          
int delta_x, int delta_y) const
{
    SDL_Rect offset;
    offset.x 
= at_x - delta_x;
    offset.y 
= at_y - delta_y;

    SDL_Rect dest;
    dest.x 
= from_x - delta_x;
    dest.y 
= from_y - delta_y;
    dest.w 
= w + delta_x*2;
    dest.h 
= h + delta_y*2;

    
if ( SDL_BlitSurface(pSurface, &dest, pScreen, &offset) < 0 )
        
return false;
    
else return true;
}
这个函数,把源面上,一个左上角坐标是(from_x,from_y),宽为w,高为h的矩形区域,blit到目的面的(at_x,at_y)坐标上。
要说明delta_x和delta_y的作用,我们先思考一个问题:动画效果是如何实现的。
我们假设有个作为背景的surface,名为back,我们要让一个名为front的surface在back上动起来。显然,至少有两种方法:
1) 把front blit到back上,把back blit到screen上,flit screen,显示出原来的图像;
    把back面“搽干净”;改变front的坐标,将改变坐标后的front blit到back上,把back blit到screen上,flit screen,显示出更新后的图像。
2) 把back blit到screen上,flit screen,首先显示出back图像;
    先把back面“搽干净”;把front blit到screen上(back是一直保持在screen上的,而front会被blit到back的上层),flit screen,显示出更新后的图像。
因为,第二种方法把所有的surface都直接往screen上blit,思路更为简单,所以,我们先讨论这种方法。
而对于“搽干净”这个概念,又有两种思路:
1) 全部back更新;
2) 更新back上“被弄脏”的部分。
实际上,当前的电脑速度对在平面上的blit速度问题已经不再是问题了。但是,在不久之前,程序员们还在为了计算机图形的实现速度而绞尽脑汁。blit一部分应该是比blit全部图像要快的。所以,这个重载的blit()方法多用于对于back的blit。delta_x和delta_y是为了保证blit的back部分,比front大那么一点点。不然的话——实际上大家可以把delta_x和delta_y设置为0看看是什么效果。
posted on 2008-02-21 14:43 lf426 阅读(7373) 评论(7)  编辑 收藏 引用 所属分类: SDL入门教程

FeedBack:
# re: SDL入门教程(五):3、对SDL_BlitSurface()的进一步讨论 2008-07-09 16:07 wangyy05721984
本人最近为SDL_BlitSurface()这个函数一直困惑,我理解这个函数是用作各个层面之间复制用的。
在我的程序中创建了一个主surface:m_pMain各中画图操作都在这个面上进行,然后将其复制给其他备用的面,在复制完之后,再把m_pMain层清空,接着画其他的面。按照我的理解通过SDL_BlitSurface()将所需图片复制完之后,即使m_pMain再有任何的改变都不会影响其他的面,但结果不是的,只要我把m_pMain清空之后,随之其他的面也清空了。
请楼主帮忙解答一下,谢谢!  回复  更多评论
  
# re: SDL入门教程(五):3、对SDL_BlitSurface()的进一步讨论[未登录] 2008-07-09 18:43 lf426
我是这么理解的:blit行为的结果是描述了surface之间的关系,但是不会产生新的surface,也不会对源surface有什么改变。之所以blit之后把源面flit出来,会看到blit行为的效果,应该是因为将blit行为绑定到源面的效果。另外,你说的这个问题貌似跟blit联系不大,关键是你是怎么复制surface的?  回复  更多评论
  
# re: SDL入门教程(五):3、对SDL_BlitSurface()的进一步讨论 2008-07-09 22:41 wangyy05721984
能加我的QQ吗,想多跟你学习一下哦,289794699.  回复  更多评论
  
# re: SDL入门教程(五):3、对SDL_BlitSurface()的进一步讨论 2008-07-09 22:52 wangyy05721984
blit确实不会产生新的surface,也不会对源surface的有改变。
我奇怪的是,在我把源surface blit到另一个surface(surface2) 上去之后(即保存源表面),再把源surface 清空,接着又把surface2 复制到源surface上去,最后把源surface在屏幕上显示就会没有任何图片了

我做以上的这些,就是想看一下blit的功能。  回复  更多评论
  
# re: SDL入门教程(五):3、对SDL_BlitSurface()的进一步讨论[未登录] 2008-07-10 01:13 lf426
我QQ公布出来的,85132383,最近在Linux下时间比较多,还是发邮件方便一些哈。我还是问你,你用什么方法“复制”和“清空”surface的?  回复  更多评论
  
# re: SDL入门教程(五):3、对SDL_BlitSurface()的进一步讨论[未登录] 2008-09-15 17:52 伊凡
wangyy05721984你遇到的问题很可能blitSurface()做的事情是把源图像的首地址给了目标指针.而并非是新开了空间来存放整张图像的数据.如果只是赋勒令指针那么你的情况是理所应当的.因为你改变任何一个surface都是在改变一张图的内容.  回复  更多评论
  
# re: SDL入门教程(五):3、对SDL_BlitSurface()的进一步讨论 2011-06-27 09:59 ilj
我想问问,如果blit的两个surface的PixelFormat不同的话,blit是不是会自动将src的PixelFormat格式转换为dst的PixelFormat格式然后再进行混色  回复  更多评论
  

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