RPG游戏
├ 地图
│ ├ 背景
│ ├ 前景:建筑、山、河、树等
│ ├ 玩家
│ │ ├ 面向、坐标
│ │ └ 动作:站、走、跑、跳、其他动作如攻击
│ ├ NPC:同玩家
│ ├ 物品:掉落的东西,可捡起的东西等
│ ├ 元素:比如射击后飞行的子弹
│ └ 窗口:人物信息、技能信息、包裹、对话等
└ 游戏信息的显示窗口:迷你地图、生命值、物品栏、聊天框等
1. 地图层次
把玩家和NPC等都放到地图中是因为会出现这样一个情况:当玩家走动的时候,只需移动地图而不是移动地图时还要移动玩家和NPC。
这里把地图分成三层:
背景层:在任何时候它都处在最底层,并且我是认为它不应该有动画(影片剪辑)存在,背景是整个地图中最大的,它有大幅的动画会严重影响速度。如果需要动画那就把动画放到中间层吧。
前景层:所有会与玩家交换深度的东西都在这一层,它们会参与游戏的交互(如发生碰撞)。
顶层:在任何时候都会显示在最上面,而且为了游戏的速度,顶层并不跟着玩家的移动而移动。如:云和雨。
在每一层中也存在深度关系。
2. 地图描述
每张地图会被分割成一个区块的数组,数组的值就描述了这个区块的信息,这些信息有障碍特性、空置特性、实例深度、事件ID(比如:用于地图跳转的出口)。
障碍特性应有三种值,没障碍、有物体但没障碍、有障碍,有物体但没障碍是为了在深度交换中使用的。
空置特性:表示该区块是否为“空”可放置物品,单独使用这个来表示能否放置物品而不用障碍特性来表示,是因为可以通行的区块可能不允许放置物品,比如传送点,不可通行的区块也可能允许放置物品,想深草地上不能通行但可以放置物品。
背景和前景它们统称为图形,图形有一个ID和图形文件地址以及一个区块的数组,这个数组的值中标识障碍特性、空置特性。在文件中存储地图的描述时,是把三个层单独来表示的,背景层每个区块存一个值,类似数组,前景层是一个列表,表示出图形的ID和位置等,事件也要存储。
图形是可以被重复使用的,它们可以多次的拖放到地图上,对于前景图形它被放到地图上时还可以添加名称和介绍信息,用于在交互过程中显示,程序运行中前景图形的实例深度会赋给相应区块数组值的实例深度上(前景图形所占有的每个区块数组值都会赋值)。
使用这样的地图描述就可以很好的实现遮挡效果了,“遮”即是深度交换,以玩家和建筑物为例,只要判断玩家前方(玩家的面向即前方)一排区块中任意一个区块所对应的数组值即可知道是否需要交换玩家与建筑物的深度(此深度值即地图数组中的实例深度)。“挡”即是碰撞检测,同样也是根据地图数组中的值判断前方是否存在物体来判断碰撞的发生。
这样构建地图数组的方式完全是从效率上的考虑的,第一:数组中存放了实例深度而不是实例的名称,因为通过实例名称获得实例对象(即getChildByName方法)没有痛过深度获得实例对象(即getChildAt方法)的效率高;第二:如果不在地图数组中不存放实例深度也是可以找到前方实例对象的,可以用getObjectsUnderPoint方法获得实例对象,但这种做法程序写的不好的话会出现找不到实例对象的情况(本人用AS3改写牧场游戏时使用的是这种方法,经过多次调试才得以完美实现),因此这种方法不够好;第三:如果使用hitTestObject、hitTestPoint或者hitTest进行碰撞检测是不合适的,因为这些函数只是发生了碰撞后才能检测到,但我们实际上是要进行碰撞的预测,虽然后两个函数可以进行高效率的像素级检测而且可以通过一些手段使用它们进行碰撞的预测,但需要事先知道待检测的对象而这也正是我们想知道的而且现有的数组标识的方法效率上也很不错,因此这里的碰撞检测应该称为碰撞预测。
虽然很好的减少了频繁操作的可能,但这种做法所担心的一点就是玩家与npc之间的碰撞检测的效率问题,因为玩家和npc的任何一点移动都需要对地图数组的更改,玩家和npc多的话这将带来很大的负担,因此我准备做一个选项设置是否启用角色的遮挡特性,如果不启用将会出现角色踩在另一个角色的身上。
45度全视角,实际上45度视角并不是45度的,它在地图的高度上缩小了一半,这样视角就是26度多了,我想这样做主要是因为完全45度视角会造成没有近大远小的透视效果,导致视觉上不舒服。下面这个图是我设想的45度全视角的地图(补上了四个角上的区块,使整个地图不是一个菱形而是一个长方形),不过还在考虑是否用这种方式,这个的地图数组就仍然用90度视角下的方式,不旋转,坐标转换公式为:
小菱形高:H,小菱形宽:W=2H
游戏坐标x=2H*j-(i%2)*H
游戏坐标y=i*H/2-H/2
3. 动作与技能
一个动作的执行序列:
动作┬>技能───────┐
├>作用物体发生动作 <┤
└>无反应 <─────┘
动作和技能都是一个动画,动作由玩家或NPC自主产生,有些动作不产生技能,直接作用到物体或者无任何反应,有些动作产生技能,然后作用到物体或者无任何反应,技能动画是由程序控制的,可以有跟踪、直线飞出以及作用范围。
被动作或技能作用到的物体有时会进入一种状态,状态也可以是有动画效果的,它由定时器或者其他动作作用于它而结束。
4. 换装
实现原理:对每一个装备(如衣服和手套等等)都做多个针对每一个角色的每一个动作的动画,这些动画中只有这一个装备,为什么要多个动画呢,某个角色向左行走这个动作的手套动画就需要两个,左手一个右手一个,左手的深度最高,右手的深度最低(会被角色本身和其他装备遮挡),当然也可以是一个动画。当某个角色在进行某个动作的时候,程序要将该角色当前穿着的所有装备的该动作所有动画根据相对于角色本身的深度值放到该动作上,这样就实现了换装。
从上面那么难表达的话中可以看出换装对美术人员来说是非常大的工作量,本来一个动作要想做的很好就已经很耗时的,何况要针对每个角色的没个动作做动画。上面提到的角色一词指玩家和NPC。