aventzero吧 关注:3贴子:402
  • 7回复贴,共1

【编程】AVZ的ACT书籍自译(0起步C++)【page1-3】

只看楼主收藏回复

原书名自《アクションゲーム アルゴリズム マニアックス》转载请说明出处:零社学院 AVentZero
本翻译内容纯属学习交流用。如有法律问题,本翻译者不承担任何责任。严禁用于任何商业用途!


IP属地:中国香港1楼2013-03-10 23:33回复
    PAGE1
    ActionGame(以下简称AG)的基本要素
    首先,偶们来一起确认下一个AG所需要的要素。
    AG所需要的要素并不是很多。基本上,由以下要素组成。
    ♂主人公
    玩家们操纵的主人公。有些是类似人类或者机器人的人形物体,当然也有像动物或者车之类的。(pic-1)
    ♂敌人
    和玩家们进行攻击互动的对象。大多数的游戏中,和敌人接触有的会受到伤害有的则会攻击MISS。
    ♂武器(译者注:如子弹,剑光等)
    角色对敌人放出的,或是敌人对角色放出的攻击。当武器命中敌人,一般能够对敌人造成伤害。
    ♂地形
    构成关卡的地面或是墙壁。根据游戏的不同,会出现绳索,梯子,传送带等等的机关。
    【pic-1】


    IP属地:中国香港2楼2013-03-10 23:34
    回复
      PAGE2
      ♂背景
      位于主人公和敌人背后的天空或是树木等。有时是为了让画面感到充实而显示的,有时是为了表现出滚轴①与速度而表示的。通常情况下,角色和敌人撞到了也不会发生什么事。
      ♂道具
      角色捡起来后可以获得各种各样效果的东西。得到分数,或是无敌,根据游戏要准备各种效果。
      ♂分数
      即游戏得分。大多数的游戏中,打倒敌人、入手道具或是打通关卡都会获得得分。
      根据游戏的不同游戏规则也不尽相同。譬如说,会有敌人和主人公接触不会有MISS出现,反而会得到分数的事件。因此,每个游戏都会有细微的差别,但是基本上AG都是由以上的要素组合而成。
      AG的执行
      AG的主人公在画面内连贯地动作,这些动作其实是从很小的动作重叠产生的。(如pic-2) 。比如,从画面的左端向右端移动的主人公,最初只动了画面的1/100,下面继续动下一个1/100,这样不断进行了100次后,才能产生连贯的动作。
      这种极小的动作反复执行于微小的周期内。大多数的游戏中这个周期与画面的更新②周期相同。比如说,家用电视和电脑用的显示屏一般更新周期是1/60秒,游戏执行也是1/60秒的周期。这是因为游戏更新周期与平台的周期吻合的话,动作就会更加流畅自然。
      敌人,武器,地形,背景,道具等也和角色一样,是根据很小的动作画面不断反复来产生连贯的动作的。所谓AG的程序,便是由 以上的各种要素分别进行小动作画面的处理为1周期,反复执行这些周期性动作而运转起来的。
      这个【短周期内主人公的小动作处理】便是在AG内产生各种动作的关键。本书中将这个处理称之为动作处理。在本书的各个项目中,主要是以解说动作处理的算法,并告诉大家这些代码的写法。
      (译者注①:滚轴就是类似于超级玛丽的那种随着主角移动画面背景跟着变化的系统。)
      (译者注②:更新就是刷新整个画面,流程相当于消除前一个画面,描绘并显示出后一个画面,更新周期即为这样动作执行一次所消耗的时间)
      【pic-2】


      IP属地:中国香港3楼2013-03-10 23:35
      回复
        PAGE3
        FRAME①的定义
        FRAME就是指画面全体。TV之类的显示机械经常使用这个词语,在游戏界也会用到。
        画面全体1庙内更新的次数,我们称之为【每秒30帧】或是【每秒60帧】等等。更新周期为1/60的游戏,我们就说这个游戏每秒60帧。
        以AG为首的街机类游戏中,大多是每秒60帧的。这与TV之类的电视器画面的画面更新周期相同。
        比如对于主人公的移动,每1帧都让其稍微移动一定的坐标与角度。每秒60帧的话,主人公便会动60次,1秒的动作就这么出现了。
        玩游戏或者是做游戏都会经常用到帧这个次。譬如
        “新出的3D游戏买了回来发现只有30帧爆失望……”、
        “AG果然还是要60帧的好啊!!”
        “能不能想个法在一帧里搞定这个问题?”
        还有,每秒更新的帧数,我们称之为帧速率(FRAME RATE)。帧速率的单位是fps(FRAME PER SECOND 帧每秒)。每秒60帧,就是60fps。在和游戏同道与游戏编程同道人中讲话时,不必明确地区分fps,frame,fram rate这些词来使用,会经常使用【60帧】,【60帧每秒】【帧速率是60】【60fps】来表达。
        除此之外,还有【int②】这个词语,经常会当成frame来使用。这个词来源于【interrupt】指垂直同步。所谓垂直同步,就是通知画面更新的时机,一般游戏用硬件的话是1/60秒发生一次。
        (译者注①:帧,就是指画面全体,没有时间观念的词语。也就是静止的画面。)
        (译者注②:垂直同步帧,同上。要注意不是编程语言内的int(整数型)的意思。)


        IP属地:中国香港4楼2013-03-10 23:35
        回复
          PAGE4【三】碰撞判定处理
          判定主人公或是敌人之类的这样的同类型物体接触与否的处理叫做【碰撞判定处理】。动作游戏中,一旦主人公和敌人接触的话,就会变成①MISS。主人公释放的武器接触到敌人的瞬间,能够给予敌人伤害。根据碰撞判定的处理来判断相同类型的物体是够接触,对应这个结果,产生打倒敌人或者失去道具之类的效果。
          不只是AG,所有类型的游戏中,碰撞判定都是非常重要的要素。射击游戏中自己的集体是否碰到了子弹,格斗游戏中拳头是否命中了,体育游戏中是否打到球了,这些判断都是碰撞判定。
          之前说明了主人公做动作的方法(见基础篇一),但是主人公光动起来还是不会成为一个游戏的。对于主人公动作的处理,碰撞判定与伤害处理,计算分数等全部合起来,才会形成游戏的雏形。
          碰撞判定处理的范例碰撞判定处理有很多种方法。正统的方法是使用矩形(即长方形)来判定。(pic-3)。根据游戏的不同,有时不使用矩形而使用圆形判断碰撞的也有。
          本书所处理的都是2D碰撞判定,3D的碰撞判定也是万变不离其宗的。3D使用的是立方体或球体做判定,或是采用多角形(3D术语,polygon)来进行碰撞判定。
          那么,在本书中把为了执行碰撞判定的坐标信息叫做【碰撞判定】,使用这些信息做实际判定处理时叫做【碰撞判定处理】。pic-3中,主人公的判定矩形为②(CL,CT)~(CR,CB),敌人的判定矩形为(ER,ET)~(ER,EB)。这时,主人公与敌人的接触条件如下
          CL<ER&& EL<CR &&CT<EB &&ET<CB


          IP属地:中国香港5楼2013-03-11 23:07
          回复
            PAGE5
            碰撞判定还有以角色的中心坐标上下•左右对称为判定依据的。如pic-4的用法。主人公的中心坐标为(CX,CY),敌人的中心坐标为(EX,EY),X方向的碰撞判定长度为XDIST,Y方向的碰撞判定长度为YDIST。那么这时,主人公与敌人的接触条件如下
            abs(CX-EX)<XDIST && abs(CY-EY)<YDIST (abs为绝对值的意思)
            这个逻辑算式就是“主人公和敌人在X,Y方向上各自都相距一定距离后,便认作接触。”
            译者注①:MISS指代未命中,也可以是错误,这里指和一般行为不同的结果。
            译者注②:这里的矩形定位为左上角的点与右下角的点。CL为Character Left(角色左),CT为Character Top(角色上),CR为Character Right(角色右),CB为Character Bottom(角色下),E为Enemy(敌人),其他同角色方向。


            IP属地:中国香港6楼2013-03-11 23:07
            回复
              PAGE6
              ①多线程处理系统的定义
              多线程处理时游戏编程的一种方法。不论是什么类型的游戏,特别是动作类和飞机射击类游戏尤其会采用这种方法编写。当然根据游戏不同,可能多线程处理的叫法也不同。
              多线程系统就是一种为了能够同时处理多项指令(项目)的方法。使用多线程编程的话,游戏中出现的各种要素都将作为一项项系统所要执行的项目。譬如如果是动作游戏,主人公,敌人,武器等物体,每个都封装②成属于自己的项目。
              项目就好像是论坛的帖子。在游戏里,各种各样的角色会一起行动,使用了多线程就像大家一起发帖子一样,能够自然顺畅地表现出来。
              除此之外,多线程提供了生成或者消除项目的功能。对于【发射子弹的处理】【敌人被击倒后消失的处理】都非常有用。而且,多线程系统可以有效的管理并释放内存,即使是反复的生成消除,电脑的也不会因为空内存形成的浪费而降低性能。
              多线程系统中执行项目是,会与游戏中的物体动作紧密的结合。譬如,想一下主人公和敌人,以及两个炸弹的状况。(pic-5)
              使用多线程系统的话,总共有主人公,敌人,2颗炸弹共计4个项目显示了出来。然后,按照顺序③执行与这些相关的动作处理和画面描绘。而且地面也可以作为项目来处理。
              译者注①:线程可以理解为程序执行指令时的通道。一个程序同时执行多条指令,即为多线程。
              译者注②:封装通俗理解就是将部分的编程代码独立开来。在一块固定的区域(容器)内执行。
              译者注③:其实多线程的执行对于我们来说几乎是同步的,但是电脑内部还是有先后顺序的,为了使多个项目看似同步,必须按照顺序分别执行譬如1,2,3,4各执行1%,再回到1,继续1234各执行1%来达到我们眼睛看到的同时执行。(假如这个1%只需要0.001秒)


              IP属地:中国香港7楼2013-03-11 23:08
              回复