触发器 前篇

触发器

 

离上次写博已经有6天了,近来一直在思考Project.O的设计问题。事无巨细,从头到尾全部都要自己来做,从装备的属性所要使用的数据结构到整个游戏引擎各个模块之间的调用方法,数据的处理……对于我这么一个经验不丰富或者说经验及其缺乏的初学者来说的确是很挑战性的,甚至于说,远远超过了我的想象。就是因为这个原因,其实当心思放在Project.O的时候感觉是很忙乱的,也就无心写博,不过总是觉得有些东西该记一记,就随便写点……最后抱怨下学校的临晨1点断电原则,因为现在已经2344分了

某天,兴致勃勃的画了一张类图,非常的壮观,实体Entity 实体的子类 等等…… 继承深度有4-5层,非常庞杂。

 

首先,还是先说说 触发器。

触发器,google一下,得到的结果大多都是些什么数据库触发器,或者就是电路上面的撒撒撒……其实我想知道游戏里面这个术语的意思到底是什么~但是我就像一只迷途羔羊一样在网上乱转了几天却百思不得其解。如何在程序中实现触发器这样的功能,满足触发器的三个要素:事件,条件,动作

 

当某事件发生的时候,如果满足某条件,就采取什么动作。

 

这看起来很简单……实际上问题是由如何让一个装备拥有一些很特殊的属性,比如 施放某个技能的时候有5%几率回复1%魔法值 又或者 攻击的时候有5%几率得到一个提升自己攻击力10点持续20秒的增益效果,再如 如果攻击没有暴击则得到一个提高0.5%暴击几率的增益效果,最高可以叠加20层或到你暴击为止

这些东西好像都可以用触发器简单的解释,比如:

玩家 施放技能(事件) 5%几率(条件) 回复1%魔法值(动作)

玩家 攻击(事件) 5%几率(条件) 获得增益效果(动作)

玩家 攻击(事件) 没有暴击,少于20层(条件) 获得增益效果(动作)

然后通过和OwnWaterloo的讨论,得到了一些借鉴。原来自己一直经常提到的Observer模式就可以用来实现这个被称之为触发器的东西。而且更甚,这样的东西,其实以前在JAVA中早有接触……比如一个ButtonActionListener,就是在Button在被按下(事件)的时候引起某一个动作(动作)。

如果把 攻击 特殊成一个事件,就可以设计出这样简单的一个东西:

 

class Player;

 

class PlayerListener {

public:

  virtual void onAttack(Player* p)=0;

};

 

class Player {

public:

  Player(int atk=10) :mAtk(atk) {}

  void setAtk(int atk) { mAtk = atk; }

  void getAtk() const { return mAtk; }

  void attach(PlayerListener* pl) { mListeners.push_back(pl); }

  void detach(PlayerListener* pl) { mListeners.remove(pl); }

  void attack() { 

    printf("Basic Attack = %d",atk);

    for(ListenerVec::iterator iter = mListeners.begin();

      iter != mListeners.end(); ++iter) {

        (*iter)->onAttack(this);

    }

  }

private:

  typedef std::vector<PlayerListener*> ListenerVec;

  int mAtk;

  ListenerVec mListeners;

};

 

class AddAtk : public PlayerListener{

public:

  //on Event

  void onAttack(Player* p) {

//can pull sth from p like p->getSth()

//if condition do action

    if (p->getAtk()<=20) {

      p->setAtk(p->getAtk()+10);

    }

  }

};

//这里实现的监听器是在攻击力小于20点的时候每攻击一次提升10点攻击力

Player *p1 = new Player();

AddAtk addAtk;

p1->attach(&addAtk);

p1->attack();

 

这样做就可以把我们所要抽象的 事件(Event 发生的时候 提醒(Notify 监听器(Listener 或者叫 Observer

在监听器中实现 条件(Condition 动作(Action

而且可以通过对接口类的实现实现各种各样的触发事件,也提供了设计上的灵活性。

 

今天经过一些思考,还有一些额外的想法,不过并没有实践之……还应该审视一下~今天快没时间了,明天再看能不能补上吧……

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值