作者StubbornLin (Victor)
看板GameDesign
标题[程式] 小型2D线上游戏心得分享 : 自订图档
时间Mon Jul 31 14:43:00 2006
上次介绍的是图像引擎,这次介绍自订的图档格式
自订的图档格式有很多好处,就是图档对一般玩家来说,他们是没有办法拿到的
虽然说对比较有技术的玩家来说,花时间去分析档案的格式就可以办得到
但是至少不会看见自己游戏的图档在网页上到处乱飞,除此之外,一般标准的图档
格式,里面所含的资讯不一定能符合游戏的需求,而当档案格式是自订时,你可以
用自己的方式压缩,加入一些杂七杂八的资讯,多张图片构成的动画,都可以
在一个档案内完成,这就是好处所在。
当然,为了要有自订的图档格式,编辑器或转档程式是免不了的,如果只是转档程式的话
就表示只是把一般图档转换成自订格式,外加的资讯就没有,因此我们这里只介绍图档
编辑器
http://www.kinmen.info/vic/image/surface_editor2.jpg

这是我自己写的图档编辑器,它可以把.Tga档输入,然後可以编辑图档在空间中的座标
贴图的过虑方式、顶点的颜色和透明度等等,会选择.Tga档是因为.Tga有包含Alpha通道,
而且档案格式简单,当然,这只是一些功能而以,我还有选取区域的编辑还没完成
除此之外,你在写你自己的图档编辑器时,可以加入你认为在游戏中很有用的资讯
而自订的档案格式,如果说你想让这种档案可以一直使用下去,就要有良好的规划
好的档案格式,可以一直扩充,有良好的弹性,这就是看你对未来会用到的东西
怎样在现在规划好,让到时候可以加进来,程式读取对不同版本的图档也可以
轻松解决
接着,我们介绍自订档案格式的大概样子
档案格式通常有两大部份,第一个部份我们称为Head,也就是档头,而档头最好用
struct包起来,这样在读取和写入时只要直接丢给档案IO就解决了
// 直接将档头写入
fwrite(&SurfaceHead,sizeof(SurfaceHead),1,pFile);
以下是档头struct范例 (因为蛮长的 所以删一些起来):
/**
@brief 存放图片用的平面
**/
struct SURFACE{
/**
@brief Bits per pixel
**/
unsigned long BPP;
/**
@brief 资料类形
SURFACE_RGB
SURFACE_RGBA
**/
unsigned long Type;
/**
@brief Format of data
[0] normal data
[1] ...
**/
unsigned long DataFormat;
/**
@brief 图宽
**/
unsigned long Width;
/**
@brief 图高
**/
unsigned long Height;
/**
@brief 透明色
**/
unsigned long ColorKey;
/**
@brief Mag Filter
可用的值 :
GL_NEAREST
GL_LINEAR
**/
unsigned long MagFilter;
/**
@brief Min Filter
可用的值 :
GL_NEAREST
GL_LINEAR
GL_NEAREST_MIPMAP_NEAREST
GL_LINEAR_MIPMAP_NEAREST
GL_NEAREST_MIPMAP_LINEAR
GL_LINEAR_MIPMAP_LINEAR
**/
unsigned long MinFilter;
/**
@brief Blending Source factor
可用的值 :
GL_ZERO ( 0, 0, 0, 0 )
GL_ONE ( 1, 1, 1, 1 )
GL_SRC_COLOR ( Rs / kR, Gs / kG, Bs / kB, As / kA )
GL_ONE_MINUS_SRC_COLOR ( 1, 1, 1, 1 ) - ( Rs / kR, Gs / kG, Bs / kB, As /
(省略)
**/
unsigned long SrcFactor;
// 同上 省略
unsigned long DestFactor;
/**
@brief Flags
SURFACE_FLAG_COLORKEY
SURFACE_FLAG_POINTS
SURFACE_FLAG_COLORS
SURFACE_FLAG_MAG
SURFACE_FLAG_MIN
SURFACE_FLAG_BLEND
**/
unsigned long Flags;
/**
@brief Four pints of image
**/
SURFACE_POINT Points[4];
/**
@brief Colors of four pints
**/
SURFACE_COLOR Colors[4];
/**
@brief Count of hit shape's points
**/
unsigned long HitShapeCount;
/**
@brief 影像资料开始的偏移量
**/
unsigned long ImageDataOffset;
/**
@brief 延伸资料开始的偏移量
**/
unsigned long ExtendDataOffset;
/**
@brief 影像资料大小
**/
unsigned long ImageSize;
/**
@brief 延伸资料大小
**/
unsigned long ExtendSize;
};
首先,在档头前面可以加入档案的辨识名称,例如SFC是这档案格式的辨识名称
这样当读取到一个.sfc档要判断正确与否的方法,就是只要判断这三个字元正确与否
在大部份的情况下读错档案都会被发现
接着,是Version,也就是这个档案的版本,这是以後如果档案有改版时,可以由
Version来判断到底要怎样读取
剩下的,就是一些图档的资讯,在此不多做说明,这个由设计者自己决定
从图档的宽高、色深、压缩格式等等,都可以加在档头里
-------------------------------------------------------------------
然後,就是开始图档资料的部份,我们在档头里面有写到
各种资料区的Offset,作用也就是,告诉读档程式哪个区的资料,是从哪里开始
这样有个好处,就是当档头增加了一些杂七杂八的东西时,Offset只要往後移
就解决了,而各种不同版本的档案,Offset只要照着档案写的去移就没问题了
而图档的资料部份,写入和读取也是看设计者决定,你可以直接把图档的Pixel就写入
也可以使用你自己想出来的压缩方式来压缩图档,这些都可以在档头里面,描述
档案储存的方式来决定的
--------------------------------------------------------------------
以上大至上是自订图档格式的做法,因为需求上是看自己的,设计的决定
也没有一定的准则,所以这部份只要你明白图档储存的方式就很好发挥
--
VICTOR工作室 |
PTT游戏设计版隆重开幕!
|
不管是新手老手,程式美工音乐企划....
URL :
http://www.kinmen.info/vic/ |
都欢迎来游戏设计版参与讨论 XD
|
战略高手>
C/C++ |
GameTopics>
Visual Basic 6.0 |
GameDesign
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.116.64.70