首页 新闻 赞助 找找看

感觉游戏这东西包罗万物,最近打DOTA尝试着分析里面的英雄模型,不过感觉思维不清晰,希望各位前辈指点

1
[已关闭问题] 关闭于 2011-12-19 16:55
本人起个头,希望有人分析下,开阔下我的思维
英雄类(抽象类)
 {    模型类(名字、模型外观等)   
       状态类(血量、魔量、攻击力、力量、护甲、敏捷度、智力)    
       List<物品类>(一些武器、补助药品等)(属性有物品名、数量、费用等)   
       List<技能类>(各种技能)(属性有技能名、技能伤害、冷却时间等)    
       行为类(行走、站立、普通攻击、回城等)
 }
以上类分别实现各自的接口,比如状态类实现状态接口(包含一些状态的加减等方法),物品类实现物品接口(比如使用药罐可以回血、使用魔棒可以回血回魔等)
以这种方法实现英雄的模型,总觉得思维还不是很清晰,希望各位指点
峰顶飞龙的主页 峰顶飞龙 | 初学一级 | 园豆:200
提问于:2011-11-02 17:17
< >
分享
所有回答(1)
0

你的想法我觉得虽然简化了真实的WAR3模型,不过还是很不错的,基本上该有的都有了。

        enum MainProperty
{
Strength = 0,
Agile = 1,
Intelligence = 2
}

class Strength
{
public decimal StartStrength {get;set;}
public decimal IncreaseRate{get;set;}
//这里的get方法可能会从当前地图设置中读取一些信息
}

abstract class Hero
{
public Strength Strength { get; set; }
public Agile Agile { get; set; }
public Intelligence Intelligence { get; set; }
public MainProperty MainProperty { get; set; } //主属性
public decimal Speed { get; set; }
//省略了其他一些属性

public List<Skill> Skills { get; set; }
}

class Skill
{
public virtual Icon Icon { get; set; }
public TimeSpan CoolDown { get; set; }
public virtual void Cast(BaseObject obj) { } //这里施法对象未必是调用者
}

一个玩家选择了巨魔,那么就是创建了一个Troll类的实例,Troll类继承自Hero类并且override了必要的属性和方法。第一级学习了G,Troll类的Skills里加入了这个技能的实例,它的CD是0,它的Cast方法里,将BaseObject转换成Troll对象,然后增加一个重击技能(想象中本质上是在Troll类的AfterAttackHit事件里增加了一个重击伤害的调用,这样在击中后产生随机数,看是否有重击效果,如果有,那么增加伤害并且改变目标状态为眩晕)。在BeforeAttack事件中可能对target做一些判断(比如闪避,miss,无敌等)。近战G技能的调用效果里还包括看当前技能里是否包含2技能飞斧E,如果有则切换该技能(近战/远程2种不同的E可以看成两个技能)。以上是理想情况,实际上DOTA里,巨魔是两个模型,这两个模型有不同的技能,按G就是切换,同时把状态copy过去,所以切换的瞬间无敌能躲技能。再比如巨魔购买了圣剑,圣剑这个item有个PickUp方法,里面就是把当前owner(不一定是个Hero类)的攻击加250,Drop方法相反。巨魔购买了3300,它的PickUp方法是增加owner 25点的Agile,同时Hero类有个RealAttack的属性,这个属性是根据BaseAttack(基础攻击)和等级/主属性值/装备等计算出来的,因此英雄攻击后面的绿字也随之增加了。再说英雄技能比较复杂的情况,例如PD的大招分身,可以简化成如果学习了该技能,就一直有3个无敌且碰撞体积为0的不可见(不等于隐身)单位一直跟着它,它的大招效果就是执行一段动画,同时将本体变成无敌且不可见,将分身显示出来等等。单是英雄的情况可能比较简单,如果考虑到结合地图设置以及玩家控制等等,复杂度就会直线上升了。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-11-02 18:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册