Пример #1
0
 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)
Пример #2
0
 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))
Пример #3
0
    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