当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 8 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : SDL游戏编程4
帖子发表于 : 2007-05-27 23:07 

注册: 2007-02-03 9:12
帖子: 39
送出感谢: 0 次
接收感谢: 0 次
大家先看看附件中的player.bmp图片。
如果我们要去掉这个图片的背景,该怎么做了?其实很简单,那就是使用ColorKey色键了。
先看看这个SDL函数
int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key);
这个函数就是来设置色键的。surface需要设置的表面,flag标识可以为SDL_SRCCOLORKEY这个就是用来设置色键的它可以和SDL_RLEACCEL组合,SDL_RLEACCEL
有什么用我也不太清楚,帮助上说是使用RLE算法。可能速度更快吧。key就是我们要去掉的颜色了。
看看代码
代码:
#include <SDL.h>
#include <stdio.h>
   
//显示一张妹妹的图片,嘻嘻,但愿不要打哦^.^

int main(int argc, char ** argv)
{
   SDL_Surface * screen; //主表面
   SDL_Surface * image; //用来放MM-----的图片信息(像素)
   SDL_Surface * PlayerImage; //用来测试的图片
   SDL_Event     event;
   
   bool bAppRun = true;
   //初始化SDL
   if (SDL_Init(SDL_INIT_VIDEO) == -1) {
      fprintf(stderr, "SDL_Init %s\n", SDL_GetError());
      return -1;
   }
   
   //初始化成功设置退出要调用的函数SDL_Quit
   atexit(SDL_Quit);
   
   //创建一个640X480 16-bit 模式的主表面 16位可以让MM的效果好看一点
   screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
   if (screen == NULL) {
      fprintf(stderr, "Couldn't set 640x480x8 video mode %s\n",
         SDL_GetError());
      return -1;
   }
   
   //读取MM图片信息,并创建一个表面,并把数据填入该表面中。
   image = SDL_LoadBMP("./mm.bmp"); //请在终端里运行该程序
   if (image == NULL) {
      fprintf(stderr, "Couldn't load MM, %s\n", SDL_GetError()); //遗憾你不能显示MM了,不过你可以用图片浏览程序看。
      return -1;
   }
   
   //读取player.bmp
   PlayerImage = SDL_LoadBMP("./player.bmp"); //请在终端里运行该程序
   if (image == NULL) {
      fprintf(stderr, "Couldn't load MM, %s\n", SDL_GetError()); //遗憾你不能显示MM了,不过你可以用图片浏览程序看。
      return -1;
   }
   
   //读取第一个像素
   Uint8 key = *((Uint8 *)PlayerImage->pixels);
   //设置色键
   SDL_SetColorKey(PlayerImage, SDL_SRCCOLORKEY, key);
   
   //有了MM的表面了,就可以显示了。
   //将MM的表面画在我们的主表面上,用MM来作为背景
   if (SDL_BlitSurface(image, NULL, screen, NULL) < 0) {
      //解释一下NULL,第一个是按照image的尺寸显示,第二个是默认显示。你也可以指定大小,不过要用到SDL_Rect你可以看一看帮助。
      fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError()); //看看提示吧
      return -1;
   }
   
   //贴上测试用的表面
   if (SDL_BlitSurface(PlayerImage, NULL, screen, NULL) < 0) {
      fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError()); //看看提示吧
      return -1;
   }
   
   //好了更新显示画出MM
   SDL_UpdateRect(screen, 0, 0, image->w, image->h);
   
   while (bAppRun) {
      //消息循环
      if (SDL_PollEvent(&event)) {
         switch (event.type) {
            case SDL_KEYDOWN:
               //按下任意键退出
               bAppRun = false;
            break;
         }
      }
      //没事就画MM玩
      SDL_UpdateRect(screen, 0, 0, image->w, image->h);
   }
   
   //退出了程序释放MM表面的资源
   SDL_FreeSurface(image);
   
   return 0;
}

makefile
代码:
t4: main.o
   g++ -o t4 main.o `sdl-config --libs`

main.o: main.cpp
   g++ -c main.cpp `sdl-config --cflags`


附件:
t4.tar.gz [119.28 KiB]
被下载 116 次
页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-05-28 0:30 
头像

注册: 2005-12-07 0:17
帖子: 476
地址: 昆明
送出感谢: 0 次
接收感谢: 0 次
欢迎这样的贴子,要是酏个图就更好了


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-05-28 16:45 

注册: 2007-02-03 9:12
帖子: 39
送出感谢: 0 次
接收感谢: 0 次
有图片,在附件里面.
登陆后就可以下载,还有代码.


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-05-29 10:04 
头像

注册: 2006-12-02 12:25
帖子: 689
送出感谢: 0 次
接收感谢: 0 次
持续收藏中


_________________
Titainium


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-06-02 14:02 

注册: 2006-12-25 16:03
帖子: 51
送出感谢: 0 次
接收感谢: 0 次
收藏,继续期待!顶上去


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-06-02 18:34 

注册: 2007-06-02 17:48
帖子: 19
送出感谢: 0 次
接收感谢: 0 次
感觉这个程序是个纯C的(除了C99的bool关键字),为什么要用g++编译?


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-06-03 14:32 

注册: 2007-02-03 9:12
帖子: 39
送出感谢: 0 次
接收感谢: 0 次
twm 写道:
感觉这个程序是个纯C的(除了C99的bool关键字),为什么要用g++编译?

用C++比较方便,在那里都可以定义参数.主要是我比较懒呵呵.


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-06-03 14:40 
头像

注册: 2006-05-03 0:39
帖子: 8273
地址: المريخ
送出感谢: 0 次
接收感谢: 1
:shock:


_________________
PHP是最好的语言!不服来战!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 8 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译