网页功能: 加入收藏 设为首页 网站搜索  
游戏程式设计指南(HoHo篇)Lesson 3 — 图形加载篇
发表日期:2007-03-28作者:[转贴] 出处:  



  通过Lesson1和Lesson2的介绍说明,我们的游戏程序框架基本上已经具备了初步形态,同时也完成图形部分的初始化工作,接下来我们来了解一下利用HoHo引擎,游戏是如何将图像文件的数据装载到内存中;HoHo支持多种标准的图形格式文件,其中有:BMP、TGA、JPG,这三种格式概括了图形常用的三种类型,其中BMP格式是最为普通的类型,它不具备压缩能力,我们可以这样考虑,BMP就是一块平整的图形存储空间,图形数据被一莫一样的保存着;TGA文件与BMP类似,它同样不具备压缩能力,但它特殊的地方是具备图形的通道数据保存,通道数据可以制作出很多图形特效;JPG文件跟以上两种有比较大的区别,它的最大特点是支持压缩,而且压缩效率非常之高,缺点是它的图像压缩是有损失精度的,不过对于游戏中一些登入界面以及一些不需要很标准细微的图像还是有很广泛的应用范围。

注:现在新的BMP结构中也开始对32bit(带Alpha通道)的支持,HoHo引擎不对此类图形格式的支持。

HoHo所支持的图形格式:
  256色(8 Bit)的BMP格式图像。
  真彩色(24 Bit)
的BMP格式图像。
  
真彩色(24 Bit)的TGA格式图像,此格式的TGA不带Alpha通道数据。
  真彩色(32 Bit)的TGA
格式图像,此格式的TGA自带Alpha通道数据。
  真彩色(24 Bit)的JPG格式图像。
以上图形格式均可以通过PhotoShop等一些标准作图软件制作。


目录:
  
准备工作
  载入图像
    载入BMP
    载入TGA
    载入JPG

  
绘制图像
  图像释放



准备工作

  在介绍如何载入图像资源之前,我们先来看看一个新手经常遇到的问题,那就是调试环境下程序的执行路径问题,在VC.Net的IDE编辑环境中直接用 F5来执行调试程序,这时候VC.Net并不知道你真正需要的路径在哪里,换句话说,就是可能会产生你的程序和你程序需要载入的数据路径不符合,这样就会导致你程序无法打开你所需要的文件,这时候,你就需要对工程的执行路径进行设置,具体如下:

 
打开工程属性页
 

 

然后在工作路径中填入所指定的路径:

修改工作路径
 

 

好了,这样就可以把工作路径设置好,接下来我们就看看如何通过HoHo来载入图形数据。



载入图像

  终于到了实质的部分了,前面一大部分都只是在介绍游戏程序的初始化还有一些所需要注意的细节,在这节中让我们来真正的从图形文件中载入图像数据,呵呵,实际上这部分是相当简单了,我们来看看载入图形数据的步骤:

  首先,我们需要声明图形指针句柄,不要问我为什么需要这个东西,多看看C++的书籍你就能够明白,如果你实在不明白,那你就跟着做就行,将来会明白的(但愿如此!)。我们看看下面代码段:

    LP_BITMAPX g_pBitmapBMP = NULL;
    LP_BITMAPX g_pBitmapTGA = NULL;
    LP_BITMAPX g_pBitmapJPG = NULL;

声明指针
 

 



这里我们定义了3个指针,LP_BITMAPX是HoHo内部定义的一个指针结构,这个东西包含了HoHo所需要的图形资源的数据;这3个指针是我们接下来要载入的三个图像的操作句柄;

  接下来我们来看看载入图形文件数据的代码片段:

    g_pBitmapJPG = GetGraphics()->CreateBitmapFromJPG( "background.jpg" );
    g_pBitmapTGA = GetGraphics()->CreateBitmapFromTGA( "tree.tga" );
    g_pBitmapBMP = GetGraphics()->CreateBitmapFromBMP( "character.bmp" );

载入图形数据
 

 


这里分别用了三支不同的函数来进行载入数据,分别是:

  用来载入JPG图形各式的
CreateBitmapFromJPG() 注1
  用来载入TGA图形各式的
CreateBitmapFromTGA()
  用来载入BMP图形各式的
CreateBitmapFromBMP()

这三支函数对应了3种不同格式的图形文件进行了支持,其中TGA格式会自动识别图像本身是否带Alpha通道数据,如果有,在LP_BITMAPX结构中会保存Alpha通道数据,以供将来使用,如果没有,则保存为普通的图形数据方式;另外,BMP格式会自动识别256色图形的数据,并且自动将其转换为 16Bit的内部管理色彩数据。

  怎么样?很容易吧,具体如何实现图形数据载入的问题就留给HoHo来帮你解决。 :)



绘制图像

  数据载入完成了,让我们来把它们Show一下,看看是否达到我们的要求。

  我们在以前已经建立好了游戏的循环体,我们现在只要把我们的显示图像的代码放入循环中,游戏程序就会为你不停的刷新游戏窗口,当然,它的刷新内容就是你所指定的图像了。让我们来看看代码片段:

    GetGraphics()->DrawBitmapMMX( 0, 0, g_pBitmapJPG, SCREENBUFFER );
    GetGraphics()->DrawBitmapMMX( 100, 100, g_pBitmapBMP, SCREENBUFFER );
    GetGraphics()->DrawBitmapAlphaChannelMMX( 300, 300, g_pBitmapTGA, SCREENBUFFER );

显示图像
 

 

这里我们使用了三句代码来进行图像绘制,前两句是使用普通的绘制方法来进行图像绘制,最后一句是让HoHo根据图像的Alpha通道数据来绘制那个图像,这里我们不介绍绘制函数的具体操作,我们会在Lesson4进行全面的了解,这里只是为了展示你所载入的图形文件。

  代码加入后,让我们来编译运行一下游戏程序,怎么样?是否如你所愿?下图是附带的例子工程运行截图。


(图像资源来源于 金点时空 的《圣剑英雄传II》)

有没有看到我们的树闪闪发光?嘿嘿!这个就是Alpha通道数据给我们带来的图像效果,是不是像一些游戏中经常可以看到的光影效果。具体如何实现这些,我们下回再讲!



图像释放

  图形文件载入完了,也显示出来了,有一点需要我们紧记,创建了数据用完之后,把数据空间还给操作系统,养成良好的习惯是非常有用的,这里我们来看看HoHo如何释放数据:

  ……

怎么?没有代码了?呵呵,放心,还记得前面有讲过HoHo的释放,实际上HoHo在图形设备被Delete的时候,会自动将自己所用过的图像数据释放,这点HoHo已经帮你完成了,不过可能有些用户会说,我不想等HoHo的图形设备被释放后才释放图像数据,我想我游戏一边运行一边释放不需要的数据,那好,我们来看看下面的例子代码:

    GetGraphics()->RemoveBitmap( g_pBitmapJPG );

只要通过这句,就能简单的将g_pBitmapJPG这个图像数据给释放。


  好了,又到了结束时间,可能有些朋友会留下一个疑问,为什么总是要使用"
GetGraphics()->"?我可以告诉你,这个函数可以获得HoHo的图像指针句柄,当然,前提是你已经初始化完成了,这个函数是全局的,有了这支函数,不管你游戏如何构架,只要呼叫这支函数,就能立即获得图像的操作权,这样可以给我们的游戏开发带来便利。:)


  本教程到目前为止的工程文件下载
  (此档案不包含HoHo游戏引擎库,如若程式无法执行,请根据所使用的HoHo版本附带的DLL库文件替换程式所执行目录中的同名文件。)


注1:HoHo的JPG图像文件支持是通过 Intel 的 JPEG Library 进行支援,如果在游戏程序中有使用到JPG图像功能,均需要有 ijl51.dll 的支持,此文件在HoHo的数据包中有包含。


我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 游戏程式设计指南(HoHo篇)Lesson 3 — 图形加载篇
本类热点文章
  脚本系统的实现
  C++基本功和 Design Pattern系列(2) Ty..
  C++基本功和 Design Pattern系列(1) - ..
  斜45度游戏开发(提高篇)
  睱酵笴栏祘Α砞璸?? - [秈顶絞]
  斜45度游戏开发(二)
  第一次写技术文献。Collision AI
  斜视角游戏中遮挡的判断
  C语言基本功教程系列(5) - 文件, Socke..
  用rand()和srand()产生伪随机数的方法总..
  C语言基本功教程系列(1)
  C++基本功和 Design Pattern系列(3) co..
最新分类信息我要发布 
最新招聘信息

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