• 注册
  • 关于作者
    企业认证:趣记站长
    关注 6 粉丝 4 喜欢 9 内容 992
    江西省·南昌市
    聊天 送礼
    • 查看作者
    • 深切RPG游戏制作—图形篇

      文章作者:竺强

        

       不知大家有没有注意到这一点:喜欢电脑的多半喜欢游戏。为什么呢?由于岂论对男女老少来说,游戏都具有一种迥殊的魅力,休闲的魅力、回味的魅力,或是协作的魅力。但有时我也常常这样想,好比由于内存也许硬件的什么缘由,游戏玩不起来,请来朋友辅佐调整,问题解决了,兴高采烈地继续玩,那么你什么也没学到。如果据此深切,追本溯源,自始至终搞邃晓了,相信不久你就会成为电脑能手。何谓能手也都是寻常磨练出来的。大家由爱游戏而试验编游戏,也许有一天你会发觉虽然编程程度增长有限,但却不知不觉中精通了3DS也许COREL DRAW等软件,并能以另一个高度对待之前曾模棱两可的支配系统意见,这就叫潜移默化。

       那我们能编些什么游戏呢?QUAKE照样《AH-64D长弓阿帕奇》?这些恐怕许多专业编程人员也难以搞清楚其中的关键细节。我们不妨定得稍低一些,先从对速度、妙技要求较低的RPG、SLG最早,如果你有耐力、肯下苦功,再加上少量天给予灵感,相信我们中间也能出一个Tom Hall,编出比QUAKE更酷的引擎递次。

      (一)开篇

       在高设置设备铺排和软件极其丰富的今天,我想当年的《勇者斗恶龙》恐怕已很难再使玩家入迷了,从4色向16M真彩,从320×200转向1024×768的发展是大势所趋,那我们要如何来定位呢?之前引见的16色只是给大家一个入门的俭朴练习,要想抵达《炎龙骑士团Ⅱ》、《仙剑奇侠传》这样的养眼程度,256色是对比恰当的,有许多朋友会问:那么真彩呢?真彩当然好,但我们不妨作个对比,将一幅16M真彩图片经图象转换器械转换成256色后,两者相比除毫光略减外,图象失真实在不严重。只需动态的动画,如《银河飞将Ⅳ》的过场动画只需真彩(实际上是64K色)才会显出真正的威力。不过,请大家有一点要记在心田,一个游戏的真正吸引力还在于内涵和创意,空有一副外壳是没有用的,象战争画面绝不逊于《仙剑奇侠传》的《冥界幻姬》遭受败北即是一个例子。光就美工程度而论,一样是256色,制作的水准也有相等大的差异,有的以致还不如16色。而16色中,做得好的也绝不逊于256色,象光荣的《三国志英杰传》在画面上就看不出哪点比智冠的《三国演义Ⅱ》差,似乎还强些。游戏今后一定向真彩发展,大家纵然有了真彩的编程状况,美工照样需要细致对待。

      (二)颜色

       颜色是物体的一个表面特征,对我们大多半人来说,实在不克不及直接与毫光打交道,我们看到的是颜色效果。当我们坐在屏幕前,运用一种器械发生发火、控制种种颜色,必须邃晓眼睛看到的颜色实际上是由颜料反射的毫光。这在一最早可以或许会不太习惯,但在深切学习搜罗毫光效果在内的美工妙技时,有需要首先邃晓颜料的颜色。

       画家经过进程混合颜料来取得新的颜色,这类混合后能发生发火多种颜色改变效果的基色称为原色,它们是红、绿、蓝,好比我们需要洋红,那就混合红和蓝,需要白色,就要混合等量的红、绿、蓝。现在我们来看看其余一种配色设计:即由RGB三基色互补而成的洋红色(MAGENTA)、雪青色(CYAN)、黄色(YELLOW)三色CYM形势。CYM形势的一个重要辨别在于三基色混合在一起取得黑色而不是棕色,象一样寻常我们接触的LCD液晶展现用的就是CYM设计。

       颜色(HUE)就是一样寻常所说的颜色。许多人可以或许会觉得惊奇白、黑和灰也是无颜色的颜色,寻常说的彩色即有颜色的颜色,而灰色则是彩色和黑的混合物,邃晓它们对邃晓电脑图象创作是很重要的。不合的颜色在视觉上会发生发火不合的效果,有些随意马虎让人放松,有些使人惴惴不安,尚有一些暗示着风险或安然,统统这些在编游戏时都要推敲进去。一件作品的好坏,也许谐和比华丽更重要,你没必要一定要以一个艺术家的角度去绘制那些游戏画面,但在游戏出品前,先听听其他人的意见是个不错的主意,如果这些颜色使他们憎恶,那我想在你的作品正式推出前会是件好事。

       在PC机中,以类型VGA来说,R、G、B的亮度(即颜色深浅)各分为2^6(64)中分,一共需要18个位来泄漏显示,白色即(63,63,63),这类方法共能展现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)的输入接口,对这些芯片来说,

      Win32 API 使用的特殊情况
      基于Delphi的屏幕抓图技术的实现,Delphi中数据的自动录入,Delphi编程:用流来读取TXT文件中的数据,使用Delphi创建IIS虚拟目录的方法,Delphi初学者应小心的六大陷阱,Delphi“判断服务器路径”与“清空日志文件”,利用VFW在Delphi中开发视频捕获程序,Delphi实现网页表单数据的自动提交,Delphi编程使用HOOK监视Windows,Delphi编程禁止用户关闭操作系统,Delphi中利用钩子实现QQ聊天窗口的修改,一个判断定文件是否为文本文件的函数,把Flash文件转换为Exe文件,用Delphi实现文件下载的几种方法,Delphi中保存图像列表,基于Delphi的接口编程入门,在Delphi中使用CreateOleObject方法对WORD文件进行操作,利用Delphi开发旅游景点微机售票系统,Delphi中用ICMP探测远程主机状态,Delphi7对XML的支持分析
      Delphi

      输入的旗子暗记就是实在的色值,所以只需按RGB名堂转换即可。由于回收的数据传输接口位数增加,所以在速度上可以或许提高许多,当然SVGA卡上的集成化和一些加速设置也功不可没。在画图形势下,这类卡供给硬件光标服从,减轻了CPU累坠。

      (三)展现形势

       VGA的画图形势中,最重要的是形势12和形势13(我想大部分玩家手上已没有CGA、EGA展现卡了吧)。形势12H回收平面式对应的方法,支持640×480,视频内存肇端所在为A0000H,和其余D、E、10H三种形势一样同为16色,只是分辨率有所不合。视频内存所在上,每个字节代表8个像素,每一位又可对应到颜色平面中一样职位的4位上。当我们要在屏幕上绘出一个点时,就必须将数据告别存放到四个颜色平面中对应的位上。VGA供给了许多存取颜色平面数据的方法,如一次存取4个颜色平面数据或每次只对单一平面支配,哪种方法对比快呢?如果是图象方面的措置责罚,遴选第二种较志向;而关于画点体式款式的作图,第一种更快速一些。

       形势13H是VGA卡中独一可同显256的形势,支持分辨率320×200,视频内存肇端所在A0000H,它回收的是线性对应的方法(SVGA的统统256色和真彩都是用这类方法)。线性对应将屏幕上每一点与视频内存所在按递次一一对应起来,一个点对应一个字节,这样做的长处是:这类对应体式款式比颜色平面对应体式款式俭朴多了,由于我们只需直接对视频内存所在做存取即可,而没必要理会颜色平面与内存所在的对应相关。大家不难看出,实在线性对应就是将四个颜色平面的内存勾通在一起,而成为一种直线的排列。

       13H的初始化编码,《大众软件》往年第一期中黄明朋友已给出,如果大家用的是TURBOC,也可以或许这样写:

      [NO.1]

      setup-graph() /* VGA 13h 形势初始化 */

      {

      union REGS r;

      r.h.ah=0;

      r.h.al=0×13;

      int86(0x10,&r,&r);

      }

      close-graph() /* 关闭 VGA 13h 图形系统 */

      {

      union REGS r;

      r.h.ah=0x00;

      r.h.al=0x03;

      int86(0x10,&r,&r);

      }

       SVGA由于要存取更高分辨率或更多颜色的数据,一样寻常都起码具有512K以上的内存,但其所占用视频内存的所在仍多半是64K。在内存所在发生发火不够用的状况下,SVGA的区域切换服从将悉数内存划分为许多内存页,然后运用切换服从把不合的内存页对应到A0000H或其余的视频内存所在上。但现在各个厂家的SVGA卡规格都不一样,切换内存页的方法也不尽相同,而且有些展现卡上还设有两个切换开关,这是我们需要注意的。

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

      [NO.2]

      #include

      int huge Return-SVGA256(void)

      {

      return(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 setup-svga256(void) /* SVGA 256色形势初始化 */

      {

      int gm,driver = DETECT;

      installuserdriver(“svga256”,Return-SVGA256);

      initgraph(&driver,&gm?);

      }

      void main()

      {

      setup-svga256();

      setcolor(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号形势。

      (四)函数和优化

       如果大家细致观看TURBO C下的系统目录,就可以或许发现许多 *.BGI文件。TURBO C图形系统可分为与机器无关的图形库(GRAPHICS.LIB)和以文件形势存在于磁盘上的字体库(*.CHR)、图形设备驱动递次(*.BGI)。BGI即Borland Graphics Interface的缩写,是美国BORLAND公司编出的一套通用图形接口,如EGAVGA.BGI为 EGA/VGA卡的驱动递次。这是个经过进程直立服从函数库而使编程者能在图形措置责罚上独立于种种展现系统的设备,但出于兼容性的推敲是以牺牲速度作为补偿的,而且它也不支持SVGA卡关键的256色或真彩展现,虽然早期的许多游戏(以致搜罗一些射击游戏)确实都是在这些驱动递次上编写的,但关于现今速度上要求极高的、迥殊是三维游戏无疑是不现实的。一个最好的设备就是自行编写高效的图形原码,从画点做起,进而扩展需要的悉数图形库。有的朋友可以或许会说:“象RPG中画几条菜单框框慢不了多少时刻吧。”但如果卷轴平移呢?640×480×256是个什么样的量级意见!就算慢不了多少,你为什么不克不及使它更快呢?

       画点是很重要的一步,几乎统统的图形函数都是以它为基础,下面我为大家供给一个适合于种种分辨率下的高效画点原编码:

      [NO.3]

      #include

      void point(int x,int 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说明的函数或不加说明的函数遵照从右向左的递次将参数压入堆栈,即给定调用函数(a,b,c)后,a最早进栈,然后是b和c。进入汇编编码进程后,寄存器BP内容必须存在堆栈中,今后栈指针SP的值存入BP,如果子递次用SI和DI,独一必存的寄存器为SI和DI,从汇编言语子递次返回之前,必须恢复BP、SI和DI,着重新设置堆栈指针。

       最后一种设备,实在缺少函数编程经验的朋友可以或许经过进程Internet下载一些支持VGA/SVGA的高效图形函数库,这些然则现成可以或许用的,翻阅README可找到详确的函数定义说明。“我一定要用Borland的驱动递次作画!”那我也不阻挠,也许明年786就要出来了(笑话)。

      Win32 API 使用的特殊情况
      基于Delphi的屏幕抓图技术的实现,Delphi中数据的自动录入,Delphi编程:用流来读取TXT文件中的数据,使用Delphi创建IIS虚拟目录的方法,Delphi初学者应小心的六大陷阱,Delphi“判断服务器路径”与“清空日志文件”,利用VFW在Delphi中开发视频捕获程序,Delphi实现网页表单数据的自动提交,Delphi编程使用HOOK监视Windows,Delphi编程禁止用户关闭操作系统,Delphi中利用钩子实现QQ聊天窗口的修改,一个判断定文件是否为文本文件的函数,把Flash文件转换为Exe文件,用Delphi实现文件下载的几种方法,Delphi中保存图像列表,基于Delphi的接口编程入门,在Delphi中使用CreateOleObject方法对WORD文件进行操作,利用Delphi开发旅游景点微机售票系统,Delphi中用ICMP探测远程主机状态,Delphi7对XML的支持分析
      Delphi

    • 0
    • 0
    • 0
    • 73
    • 单栏布局 侧栏位置: