def update(self): owner = self.owner if owner.distanceToTractor() <= self.r2: owner.setState(AttackState(owner)) avoidance = Environment.getInstance().staticAvoidanceVector(owner.worldPosition) randomness = owner.randomDirectionVector() owner.iterTurn(5*avoidance + randomness)
def update(self): owner = self.owner dist = owner.distanceToTractor() if self.r2/2 < dist < self.r2: if owner.tractorAimError() > pi/6: owner.walk() owner.iterTurn(5*Environment.getInstance().staticAvoidanceVector(owner.worldPosition) + owner.randomDirectionVector() + 10*owner.vectorToTractor()) else: owner.setAnimation('attack') owner.setVelocity((0, 0)) owner.turn(0) elif self.r1 < dist <= self.r2/2: owner.run() owner.iterTurn(5*Environment.getInstance().staticAvoidanceVector(owner.worldPosition) + owner.randomDirectionVector() + 10* owner.vectorToTractor()) elif 0 < dist <= self.r1: owner.setAnimation('attack') owner.setVelocity((0, 0.07)) owner.turn(0) else: owner.setState(WanderState(owner))
def avoid(self): owner = self.owner avoidance = Vector((0,0)) for sheep in owner.flock: p1 = Vector((owner.worldPosition.x,owner.worldPosition.y)) p2 = Vector((sheep.worldPosition.x,sheep.worldPosition.y)) dist = (p1 - p2).magnitude theta = atan2(p1.y - p2.y,p1.x - p2.x) if .001 < dist < self.r1: size = 1/dist**2 avoidance.x += size*cos(theta) avoidance.y += size*sin(theta) env = Environment.getInstance() avoidance += env.staticAvoidanceVector(owner.worldPosition) try: ramAvoidance = owner.avoidanceVector('ram') ramDist = owner.distance('ram') if 0 < ramDist < 1.5*self.r1: ramAvoidance *= 1.5/ramDist**2 avoidance += ramAvoidance except: pass tractorDist = owner.distance('tractor') if 0 < tractorDist < 3*self.r1: avoidance += owner.avoidanceVector('tractor')*(5/tractorDist**2) if avoidance.magnitude > 0.05: owner.run() self.direction += avoidance*10 return if avoidance.magnitude > 0.04: owner.flounder() else: owner.walk() avoidance.normalize() self.direction += avoidance*10