登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
  立华软件园 - 安全技术中心 - 技术文档 - 入门基础 技术文章 | 相关下载 | 电子图书 | 攻防录像 | 安全网站 | 在线论坛 | QQ群组 | 搜索   
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
 其他安全技术资源
  · 攻防演示动画
  · 电子图书
  · QQ群组讨论区
  · 其他网站资源
最新招聘信息

在DirectX中贴瓷砖:Part 1
发表日期:2007-03-28作者:[转贴] 出处:  

先决条件

对C/C++和DirectX知识都要有较好的基础,我希望读者应该能通过这个指南获得一些东西。我假定读者能够使用DirectDraw并能够将图像文件加载到一个离屏表面。在本文中我不再描述怎样载入位图。

贯穿整篇文章,我将使用Windows/DirectX技术,但是如果你使用Dos或其他平台,你也不要担心,所有演示的方法都是容易移植的:)

注意:我的所有代码不可能绝对没有Bug,而且我的技术可能也不是最有效的,但我将尽我的全力。一起享受吧!

到底瓷砖是什么?

一块瓷砖就是一个小位图,是可以被重新置位的小块位图,有着相似或不同外观的小块一起拷贝到一个表面上,就形成了你的游戏世界的外观了。相对于使用单一位图,“瓷砖”靠创建虚拟位图而节省了很多内存。现在,普通的瓷砖都是32*32或16*16象素大小,而地图范围从几个瓷砖到几百个瓷砖不等。

在游戏的初始化或设置时,我们可以从ASCII文本文件中加载地图,其格式很象这样,“1”的位置就是一个特殊的瓷砖,“2”的位置是的另一个瓷砖,以此类推。
22222222222222222
21111111221111112
22111111111211122
21111112221111112
21111112222111112
22222222222222222

地图也可以被定义成字符数组,但这不是首选的。在这,我将使用这种格式,尽管我强烈建议从分离的i/o文件中加载地图。

许多开发者喜欢用类或结构重新定义他的瓷砖,可以加入一些标记来指定不同的“运动”属性,扩展的项目被用来放置特殊的瓷砖如可动的瓷砖和多重的瓷砖层,但是对于我们,仅仅把瓷砖贴到屏幕,使用瓷砖类未免也有些过火了。

我们将定义我们的瓷砖组合就像如下所示,一个12*12个瓷砖的地图置入一个2维的字符数组里。
char map[12][12] = {
   {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
   {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
   {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
   {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
   {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
   {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
   {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
   {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
   {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
   {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
   {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
   {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}};

在这种格式中,我们能用map[x_tile][y_tyle]来访问每个瓷砖。在本例中,一个值为“2”的瓷砖就是一座墙,或者一个实心的瓷砖,游戏中的角色不能穿越。ID#为“1”的瓷砖代表可以活动的地域。我们可以在定义瓷砖的类型,只要设置map[x_tile][y_tile]的值就行了如: map[x_tile][y_tile] = new_id;

接下来我们要创建一个位图,它存储了每一个瓷砖的图像。你也能够创建你自己的瓷砖,或者从别人的RPG中透取:)整理这些图像就好像这样。(图片略)

注意:
在画瓷砖的函数中,因为设置了RECT所以这种格式才能工作。如果你更喜欢用其他方法设置你位图中的瓷砖,你必须相应的设置RECT

最后,我们能创建一个函数将字符数组中的“1”和“2”变成图像,并用DirectX显示之。你必须确信你已经设置好DirectX并能运行之。我将用完我的每一段代码 “NeHe style”,因为他给了我指南的灵感,他的指南总是那么容易理解。

#define TILE_SIZE     32
#define WORLD_SIZEX   12
#define WORLD_SIZEY   12

在这我定义了32*32象素的瓷砖,地图的大小为12*12个瓷砖。

void draw_tiles(void)
{
   int tile;
   int x;
   int y;

   RECT tile_src;

tile将被用在后面,用来决定map[y][x]的值,举个例子,当我们通过这个循环运行到地图数组时,map[y][x]有一个ID#值为1或2将存入tile.x,y是两个变量用来遍历整个数组并且在适当的位置画出瓷砖。RECT tile_src将用来指定每个瓷砖的位置,指向瓷砖图像将被画入离屏页面的位置。

   for (y = 0; y < WORLD_SIZEY; y++)
   {
      for (x = 0; x < WORLD_SIZEX; x++)
      {
         tile = map[y][x];    // tile 存储了特殊瓷砖的ID#

这段代码用两个“for”循环来遍历地图数组并且捕获每一个瓷砖的ID#并存入tile变量中。

注意:我们的函数一个接一个遍历每个瓷砖并且一个接一个画到表面上,那是因为这样就好像把所有的瓷砖被同时画到页面上。

         tile_src.left    =  (tile ?1) * TILE_SIZE;
         tile_src.top     =  0;
         tile_src.right   =  tile * TILE_SIZE;
         tiel_src.bottom  =  TILE_SIZE;

tile_src RECT的设置依赖于存储在tile中的瓷砖的ID值。

         BltFast(x * TILE_SIZE, y * TILE_SIZE, lpddsoffscreen, &tile_src, NULL);
      }
   }
}

现在我们把瓷砖画到了屏幕的相应位置,这要使用x,y变量乘以32象素得到。我使用lpddsoffscreen作为表面的名称,你可以用不同的名字。

结论

这是我的第一篇发表于GameDev.net的文章,我计划在将来写更多的文章。如果文章帮助了任何在DireceX或贴瓷砖上有问题的人,我将感无比开心。如果文章中有什么错误,如果你喜欢我憎恨本人请发邮件给我lpsoftware@home.com.如果本文的帮助下,你创建了一个游戏,也请告诉我。

接下来的文章

接下来的文章将基于本文,并且尽可能包括滚动大地图的技术,剪切瓷砖的技术,碰撞检测和动画瓷砖的技术。

我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 在DirectX中贴瓷砖:Part 1

 ■ [欢迎对本文发表评论]
用  户:  匿名发出:
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接  
Copyright ©2001-2006 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.002