rpg游戏制作:深入RPG游戏制作—图形篇

文章作者:竺强
  
 不知大家有没有注意到这点:喜欢电脑大都喜欢游戏为什么呢?不管对男女老少来说游戏都具有种特殊魅力休闲魅力、回味魅力或是竞争魅力但有时我也常常这样想比如由于内存或者硬件什么原因游戏玩不起来请来朋友帮忙调整问题解决了兴高采烈地继续玩那么你什么也没学到若是据此深入刨根问底从头到尾搞明白了相信不久你就会成为电脑高手何谓高手也都是平常磨练出来大家由爱游戏而尝试编游戏也许有天你会发觉虽然编程水平增长有限但却不知不觉中精通了3DS或者COREL DRAW等软件Software并能以另个高度看待以前曾经模棱两可操作系统概念这就叫潜移默化

 那我们能编些什么游戏呢?QUAKE还是AH-64D长弓阿帕奇?这些恐怕许多专业编程人员也难以搞清楚其中关键细节我们不妨定得稍低先从对速度、窍门技巧要求较低RPG、SLG开始如果你有耐力、肯下苦功再加上少许天赋和灵感相信我们中间也能出个Tom Hall编出比QUAKE更酷引擎

()开篇

 在高配置和软件Software极其丰富今天我想当年勇者斗恶龙恐怕已很难再使玩家入迷了从4色向16M真彩从320×200转向1024×768发展是大势所趋那我们要如何来定位呢?以前介绍16色只是给大家个入门简单练习要想达到炎龙骑士团Ⅱ仙剑奇侠传这样养眼程度256色是比较恰当有很多朋友会问:那么真彩呢?真彩固然好但我们不妨作个比较幅16M真彩图片经图象转换工具转换成256色后两者相比除了光泽略减外图像失真并不严重只有动态动画银河飞将Ⅳ过场动画只有真彩(其实是64K色)才会显出真正威力不过请大家有点要记在心里个游戏真正吸引力还在于内涵和创意空有副外壳是没有用象战斗画面绝不逊于仙剑奇侠传冥界幻姬遭受失败即是个例子光就美工水平而论同样是256色制作水准也有相当大差异甚至还不如16色而16色中做得好也绝不逊于256色象光荣 3国志英杰传在画面上就看不出哪点比智冠 3国演义Ⅱ好像还强些游戏今后肯定向真彩发展大家即使有了真彩编程环境美工仍是需要细致对待

( 2)色彩

 颜色是物体个表面特征对我们大多数人来说并不能直接和光线打交道我们看到是色彩效果当我们坐在屏幕前使用种工具产生、控制各种颜色必须明白眼睛看到颜色实际上是由颜料反射光线这在开始可能会不太习惯但在深入学习包括光线效果在内美工窍门技巧时有必要首先理解颜料色彩

 画家通过混合颜料来取得新颜色这种混合后能产生多种色彩变化效果基色称为原色它们是红、绿、蓝譬如我们需要洋红那就混合红和蓝需要白色就要混合等量红、绿、蓝现在我们来看看另外种配色方案:即由RGB 3基色互补而成洋红色(MAGENTA)、雪青色(CYAN)、黄色(YELLOW) 3色CYM模式CYM模式个重要区别在于 3基色混合在起得到黑色而不是棕色象通常我们接触LCD液晶显示用就是CYM方案

 色彩(HUE)就是通常所说颜色很多人可能会感到惊讶白、黑和灰也是无色彩颜色平常说彩色即有色彩颜色而灰色则是彩色和黑混合物明白它们对理解电脑图像创作是很重要区别颜色在视觉上会产生区别效果有些容易让人放松有些使人惴惴不安另有些暗示着危险或安全所有这些在编游戏时都要考虑进去件作品好坏也许和谐比华丽更重要你不必定要以个艺术家角度去绘制那些游戏画面但在游戏出品前先听听其他人意见是个不错主意如果这些色彩使他们厌烦那我想在你作品正式推出前会是件好事

 在PC机中以标准VGA来说R、G、B亮度(即色彩深浅)各分为2^6(64)等分共需要18个位来表示白色即(636363)这种思路方法共能显示2^6×2^6×2^6(256K)种颜色对于SVGA真彩由于每种颜色用8位来表示所以共可显示出2^8×2^8×2^8(16M)种颜色

 VGA/SVGA卡中负责颜色输出是RAM DAC(DIGTALTO ANALOG CONVERTOR)VGA卡将8位输入数字信号经个颜色对照表和DAC转换后由模拟信号线输出到屏幕上虽然颜色对照表中每个字段可有256K种颜色变化但因输入信号只有256种所以屏幕上最多只能同时显示256色也就是说每次从256K种颜色中选出256种来显示SVGA卡中DAC芯片必须使用16位(32K、64K)或24位(16M)输入接口对这些芯片来说输入信号就是真实色值所以只要按RGB格式转换即可由于采用数据传输接口位数增加所以在速度上可以提高不少当然SVGA卡上集成化和些加速设置也功不可没在绘图模式下这类卡提供硬件光标功能减轻了CPU负担

( 3)显示模式

 VGA绘图模式中最重要是模式12和模式13(我想大部分玩家手上已经没有CGA、EGA显示卡了吧)模式12H采用平面式对应思路方法支持640×480视频内存起始地址为A0000H和其它D、E、10H 3种模式样同为16色只是分辨率有所区别视频内存地址上个字节代表8个像素位又可对应到颜色平面中同样位置4位上当我们要在屏幕上绘出个点时就必须将数据分别存放到 4个颜色平面中对应位上VGA提供了许多存取颜色平面数据思路方法次存取4个颜色平面数据或每次只对单平面操作哪种思路方法比较快呢?如果是图像方面处理选择第 2种较理想;而对于画点方式作图种更快速

 模式13H是VGA卡中唯可同显256模式支持分辨率320×200视频内存起始地址A0000H它采用是线性对应思路方法(SVGA所有256色和真彩都是用这种思路方法)线性对应将屏幕上每点和视频内存地址按顺序对应起来个点对应个字节这样做好处是:这种对应方式比颜色平面对应方式简单多了我们只需直接对视频内存地址做存取即可而不必理会颜色平面和内存地址对应关系大家不难看出其实线性对应就是将 4个颜色平面内存串联在而成为种直线排列

 13H化编码大众软件Software今年第期中黄明朋友已经给出如果大家用是TURBOC也可以这样写:

[NO.1]
up-graph /* VGA 13h 模式化 */
{
union REGS r;
r.h.ah=0;
r.h.al=0×13;
86(0x10,&r,&r);
}
close-graph /* 关闭 VGA 13h 图形系统 */
{
union REGS r;
r.h.ah=0x00;
r.h.al=0x03;
86(0x10,&r,&r);
}

 SVGA由于要存取更高分辨率或更多颜色数据般都至少拥有512K以上内存但其所占用视频内存地址仍大都是64K在内存地址发生不够用情况下SVGA区域切换功能将整个内存划分为许多内存页然后利用切换功能把区别内存页对应到A0000H或其它视频内存地址上但目前各个厂家SVGA卡规格都不切换内存页思路方法也不尽相同而且有些显示卡上还设有两个切换开关这是我们需要注意

下面我们来看看SVGA图形化例程:

[NO.2]


huge Return-SVGA256(void)
{
(0); /* 返回各种分辨率对应编号 0~6
0) Standard VGA/MCGA 320×200×256
1) 256K Svga/VESA 640×400×256
2) 512K Svga/VESA 640×480×256
3) 512K Svga/VESA 800×600×256
4) 1024K Svga/VESA 1024×768×256
5) 256K Svga 640×350×256
6) 1280K以上 VESA 1280×1024×256 */
}
void up-svga256(void) /* SVGA 256色模式化 */
{
gm,driver = DETECT;
userdriver(“svga256”,Return-SVGA256);
initgraph(&driver,&gm?);
}
void
{
up-svga256;
color(2);
circle(100,100,50);
getch;
closegraph;
}

 大家只要把SVGA图形接口 SVGA256.BGI拷入C系统目录中编译即可为什么呢?这个驱动当然不会是BORLAND公司产品这样做个好处是:让还没有图形库子编程经验朋友可以直接利用TURBO C图形库(GRAPHICS.LIB)嵌入文件GRAPHICS.H中定义各种绘图

 这个SVGA图形驱动效果不错也能支持大多数SVGA卡象ATI、Trident、Tseng等由于SVGA卡兼容规格局限性笔者在些卡上也碰到了些问题如9440卡不支持5号模式5428卡则不支持1号、5号模式但不管哪种类型都支持0号和2号模式

( 4)和优化

 如果大家仔细观看TURBO C下系统目录就可以发现很多 *.BGI文件TURBO C图形系统可分为和机器无关图形库(GRAPHICS.LIB)和以文件形式存在于磁盘上字体库(*.CHR)、图形设备驱动(*.BGI)BGI即Borland Graphics Interface缩写是美国BORLAND公司编出套通用图形接口如EGAVGA.BGI为 EGA/VGA卡驱动这是个通过建立功能库而使编程者能在图形处理上独立于各类显示系统办法但出于兼容性考虑是以牺牲速度作为补偿而且它也不支持SVGA卡关键256色或真彩显示虽然早期许多游戏(甚至包括些射击游戏)确实都是在这些驱动上编写但对于现今速度上要求极高、特别是 3维游戏无疑是不现实个最好办法就是自行编写高效图形原码从画点做起进而扩充需要整个图形库朋友可能会说:“象RPG中画几条菜单框框慢不了多少时间吧”但如果卷轴平移呢?640×480×256是个什么样量级概念!就算慢不了多少你为什么不能使它更快呢?

 画点是很重要几乎所有图形都是以它为基础下面我为大家提供个适合于各种分辨率下高效画点原编码:

[NO.3]

void po( x, y,char color)
{
unsigned put;
put=y*320+x; /* 分辨率为320*200,若为其他分辨率请换算相应系数 */
*((char far *)(0×A0000000L)+put)=color;
}

 大家在创建自己功能同时必须注意些速度上编程窍门技巧:1.避免乘法和除法这是相当浪费CPU时间种运算求余数也应该尽可能避免2.多使用整数少用浮点数双精度那就更慢了3.减少读取磁盘文件操作次读取多量方式比少量数据多次读取要快很多4.使用Register定义变量寄存器速度甚至比内存还快5.这会是经常犯毛病尽量将费时运算移到循环外进行

 另外画图子在算法上有些需要区别考虑象斜线Bresenham算法、填充优化算法等这些请大家翻阅相关数学算法书籍还有呢?那当然是汇编了汇编是种较难维护语言有汇编经验朋友可以尝试些嵌入汇编码思路方法需要注意是对汇编语言区别C编译规定了区别规则在TURBO C中用修饰符cdecl介绍说明或不加介绍说明按照从右向左顺序将参数压入堆栈即给定(abc)后a最先进栈然后是b和c进入汇编编码过程后寄存器BP内容必须存在堆栈中当前栈指针SP值存入BP如果子用SI和DI必存寄存器为SI和DI从汇编语言子返回的前必须恢复BP、SI和DI并重新设置堆栈指针

 最后种办法实在缺少编程经验朋友可以通过Internet下载些支持VGA/SVGA高效图形这些可是现成可以用翻阅README可找到详尽定义介绍说明“我定要用Borland驱动作画!”那我也不反对也许明年786就要出来了(笑话)
Tags:  rpg小游戏 rpg游戏 rpg游戏制作软件 rpg游戏制作

延伸阅读

最新评论

发表评论