Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jun 5, 2008, 10:59:49 AM (16 years ago)
Author:
bknecht
Message:

Some updates on the trigger:

  • Reacts on defined sub classes of WorldEntity
  • List of other triggers (no check on them, yet)
  • tick function for delay triggers (have to add a startCounting() function)

etc.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/script_trigger/src/orxonox/objects/Trigger.cc

    r1383 r1541  
    3939    RegisterObject(Trigger);
    4040
     41    targetMask_.exclude(Class(BaseObject));
    4142  }
    4243
     
    4748  bool Trigger::isTriggered()
    4849  {
    49     return true;
     50    return this->isTriggered(this->mode_);
     51  }
     52
     53  bool Trigger::isTriggered(TriggerMode mode)
     54  {
     55    switch(mode)
     56    {
     57      case TM_EventTriggerAnd:
     58        return checkAnd();
     59        break;
     60      case TM_EventTriggerOr:
     61        return checkOr();
     62        break;
     63      case TM_DelayTrigger:
     64        return checkDelay();
     65        break;
     66      case TM_DistanceTrigger:
     67        return checkDistance();
     68        break;
     69      case TM_DistanceEventTriggerAnd:
     70        if (checkDistance() && checkAnd())
     71          return true;
     72        else
     73          return false;
     74        break;
     75      case TM_DistanceEventTriggerOr:
     76        if (checkDistance() && checkOr())
     77          return true;
     78        else
     79          return false;
     80        break;
     81      default:
     82        return false;
     83        break;
     84    }
    5085  }
    5186
     
    5691  }
    5792
     93  void Trigger::addTargets(std::string targets)
     94  {
     95    Identifier* targetId = ID(targets);
     96    targetMask_.include(targetId);
     97    // trigger shouldn't react on itself or other triggers
     98    targetMask_.exclude(Class(Trigger), true);
     99  }
     100
     101  bool Trigger::checkAnd()
     102  {
     103    std::set<Trigger*>::iterator it;
     104    for(it = this->triggers_.begin(); it != this->triggers_.end(); it++)
     105    {
     106      if(!((*it)->isTriggered()))
     107        return false;
     108    }
     109    return true;
     110  }
     111
     112  bool Trigger::checkOr()
     113  {
     114    std::set<Trigger*>::iterator it;
     115    for(it = this->triggers_.begin(); it != this->triggers_.end(); it++)
     116    {
     117      if((*it)->isTriggered())
     118        return true;
     119    }
     120    return false;
     121  }
     122
     123  bool Trigger::checkDelay()
     124  {
     125    if (triggingTime_ < actualTime_)
     126      return true;
     127    else
     128      return false;
     129  }
     130
     131  bool Trigger::checkDistance()
     132  {
     133    // Iterate through all WorldEntities
     134    for(Iterator<WorldEntity> it = ObjectList<WorldEntity>::begin(); it; it++)
     135    {
     136      Vector3 distanceVec = it->getNode()->getWorldPosition() - this->getNode()->getWorldPosition();
     137      if (distanceVec.length() < radius_)
     138        return true;
     139    }
     140    return false;
     141
     142  }
     143
    58144}
Note: See TracChangeset for help on using the changeset viewer.