作者bantime (景)
看板GameDesign
标题Re: [请益] 游戏制作时的多型?
时间Tue Oct 27 22:26:37 2015
恕删
刚好最近在开发战斗
手痒忍不住想来回文
我在写战斗的时候
会把资料处理的部分跟演出的部分拆开
这样如果是有Server的就比较方便去做检验
我们的战斗类似左右两边派兵的TD
场景上大概就是一堆小兵这样
因此每个小兵我视为一个class 然後身上携带一招技能(可为空技能
public class Character
{
......
一些属性这样
public readonly Skill m_Skill;
}
然後每招技能施放的时候 都会有一个Function,参数应该会是目标的集合 如下
public class Skill
{
public virtual Cast(List<Character> targets)
{
}
}
这样 基本的架构就完成了
所以 现在我要做一个群体击退的技能
public class KickBack : Skill
{
public override Cast(List<Character> targets)
{
//TODO 把targets通通击退这样
}
}
然後做个补血技能
public class AddHp : Skill
{
public override Cast(List<Character> targets)
{
//TODO 把targets通通加血这样
}
}
之後其他技能也是照此方式制作
而Skill应该会在Character的建构子里面决定
也就是
public class Character
{
......
一些属性这样
public readonly Skill m_Skill;
public Character(var somedata)
{
switch(somedata.skillType)
{
case SKILL_TYPE.KICKBACK:
m_Skill = new KickBack();
break;
case SKILL_TYPE.ADD_HP:
m_Skill = new AddHp();
break;
.
.
.
.
.
default :
mSkill = new Skill();//空技能不做事
break;
}
}
}
这样一来 在战斗运算中
我只要把我抓取到的目标
丢给施放者的技能 剩下的内容就由它自行处理了 如下
Character caster;
List<Character> targets;
caster.m_Skill.Cast(targets);
以上
其实我以前看到的战斗都不是这样写
会把技能类型存起来 然後一些参数存起来
然後每次发动技能就是要进入一次switch-case
每是我总觉得这样超蠢 我明明已经知道技能的类型了
为什麽每次都要去问它是谁
後来才想到用这方式 只需要在升级的时候决定它是谁就好
程式码也会变的单纯许多
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.240.200.8
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1445956000.A.7AF.html
1F:→ gyd: 我前面回的文章架构就是这样, 只是功能再更强大一点 10/27 23:58
2F:→ gyd: 补充一下, 这边指的强大不是指优劣, 是指有更复杂的内容 10/27 23:59
3F:→ dreamnook: 总觉在switch可以改用Factory的方式产生 10/28 13:44
你说的是这个吧
public static Skill GetSkill(uint uXid, float fBattleTime)
{
_SKILL_ skill = _SKILL_.GetData(uXid);
if(skill == null)
return new Empty();
Skill s = null;
switch(skill.eSkillEff)
{
case SKILL_EFFECT.ADD_DAMAGE_FOR_ARMS:
s = new AddDamageForArms(skill);
break;
case SKILL_EFFECT.ATK_CHANGE:
s = new AtkChange(skill);
break;
case SKILL_EFFECT.CHANGE_ADD_HP_VALUE:
s = new ChangeAddHpValue(skill);
break;
.
.
.
.
}
原文中的是我重新打的东西 而且主题是多型 我就只挑相关的东西而已
我总不可能把我写的东西全部po上来吧= =a
不过说真的 我也不是本科系出身,进入业界後也没学过Design Pattern
直到别人说啥Design Pattern我才发现我不知不觉用了这麽多
刚刚你说Factory我还特地去查一下是什麽
见识短浅敬请见谅
※ 编辑: bantime (61.216.36.98), 10/28/2015 13:58:18
※ 编辑: bantime (61.216.36.98), 10/28/2015 14:12:53
4F:推 cowbaying: 基本上 商用游戏都是用了大量的factory method 10/28 14:34
5F:→ cowbaying: 用来避免过多的程式码重复 10/28 14:35
6F:→ cowbaying: 这也是一种组件的概念 用OOP的单一或多重继承来达成 10/28 14:36
7F:→ cowbaying: 很多游戏引擎也都是这样 10/28 14:36
8F:→ cowbaying: 应该说都是这样子了 因为这样要扩充是很方便的 10/28 14:37
9F:→ cowbaying: 缺少的功能只要实作即可 10/28 14:37
10F:→ dreamnook: 我只是顺口说说而已呀XD Factory method蛮合适的 10/28 15:25
11F:→ dreamnook: design pattern我本科系出身也没教多少 也是业界才懂 10/28 15:26