示例#1
0
void FlameTowerPhysicsComponent::findDirectionToShoot(){
    // This tile size value is a bit flakey.
    Map* map = tower_->getDriver()->getGameMap();
    int tileSize = (map->tileWidth() + map->tileHeight()) / 2;

    // check if there's an npc currently being tracked
    if(foundTarget_) {
        return;
    }
    if(fireCountdown_ == 0) {
        ready_ = true;
    } else {
        fireCountdown_--;
        return;
    }
    projectilePath_.setP1(tower_->getPos());
    projectilePath_.setP2(tower_->getPos());
    projectilePath_.setLength(0);

    // get all npcs within range
    enemies_ = map->getUnits(tower_->getPos().x(), tower_->getPos().y(),
                             ceil((double) getRadius() / tileSize));

    if (enemies_.isEmpty()) {
        foundTarget_ = false;
        return;
    }

    QSet<Unit*>::iterator iter;

    for (iter = enemies_.begin(); iter != enemies_.end(); ++iter) {

        // this would be the place to add a priority algorithm if we need one
        // make sure that the unit is not a player
        if((((*iter)->getID()&0xFF000000)>>24) == NPC::clsIdx()) {
            if(!isValidTarget(*iter)) {
                continue;
            }
            projectilePath_.setP2((*iter)->getPos());
            // check that they're actually in range
            if (projectilePath_.length() < getRadius() - 24) {
                target_ = *iter;
                projectilePath_.setLength(getRadius() - 24);
                foundTarget_ = true;
                return;
            }
        }
    }
}
示例#2
0
bool VirtualSlot::_addTarget(Slot *target)
{
	assert(target);
	if(target) {
		if(!isValidTarget(target)) {
			return false;
		}
	//	if(_target.size()>0)
	//	    return false;

	//	_displayName=target->getDisplayName();
	//	_type=StringTool::toLowerCase(target->getType());

	//	_partner->setDisplayNameAndType(target->getName(),target->getType());
	//	_target.insert(target);
		onAddTarget(target);
	}
	else {
		return false;
	}

	return true;
}