Advertisement
Guest User

Untitled

a guest
Oct 21st, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.77 KB | None | 0 0
  1. from pygame.math import Vector2
  2. import math
  3. from helperFunction import HelperFunctions
  4. import random
  5. import pygame
  6.  
  7. class SteeringBehaviours(object):
  8.  
  9. def __init__(self, agent):
  10. self.agent = agent
  11. self.panic_distance = 100.0
  12.  
  13. self.circle_radius = 10
  14. self.wander_angle = 30
  15. self.angle_change = 0.5
  16.  
  17. def calculate(self):
  18. pass
  19.  
  20. def seek(self, target_pos):
  21. desired_velocity = Vector2.normalize(target_pos - self.agent.pos) * self.agent.max_speed
  22. return desired_velocity - self.agent.velocity
  23.  
  24. def arrive(self, target_pos):
  25. desired = target_pos - self.agent.pos
  26. d = Vector2.length(desired)
  27. desired = Vector2.normalize(desired)
  28. if d < 100:
  29. m = HelperFunctions.map(d, 0, 100, 0, self.agent.max_speed)
  30. desired *= m
  31. else:
  32. desired *= self.agent.max_speed
  33.  
  34. return desired - self.agent.velocity
  35.  
  36. def flee(self, target_pos):
  37. panic_distance_sq = self.panic_distance * self.panic_distance
  38.  
  39. if Vector2.distance_squared_to(self.agent.pos, target_pos) > panic_distance_sq:
  40. return Vector2(0, 0)
  41.  
  42. desired_velocity = Vector2.normalize(self.agent.pos - target_pos) * self.agent.max_speed
  43. return desired_velocity - self.agent.velocity
  44.  
  45. def pursuit(self, evader):
  46. to_evader = evader.pos - self.agent.pos
  47.  
  48. relative_heading = self.agent.heading.dot(evader.heading)
  49.  
  50. if to_evader.dot(self.agent.heading) > 0 and relative_heading < -0.95:
  51. return self.seek(evader.pos)
  52.  
  53. look_ahead_time = Vector2.length(to_evader) / (self.agent.max_speed + Vector2.length(evader.vel))
  54.  
  55. return self.seek(evader.pos + evader.vel * look_ahead_time)
  56.  
  57. def wander(self):
  58. circle_center = self.agent.velocity
  59. circle_center = Vector2.normalize(circle_center)
  60. circle_center = circle_center * self.circle_radius
  61.  
  62. displacement = Vector2(0, -1)
  63. displacement *= self.circle_radius
  64.  
  65. displacement = self.set_angle(displacement, self.wander_angle)
  66. self.wander_angle += random.random() * self.angle_change - self.angle_change * 0.5
  67. wander_force = circle_center + displacement
  68. pygame.draw.circle(self.agent.game.screen, (255, 0, 0), (int(circle_center.x + self.agent.pos.x) , int(circle_center.y + self.agent.pos.y)), int(self.circle_radius))
  69. pygame.draw.circle(self.agent.game.screen, (255, 255, 0), (int(wander_force.x + self.agent.pos.x), int(wander_force.y + self.agent.pos.y)), 5)
  70. return wander_force
  71.  
  72. def set_angle(self, v, value):
  73. len = Vector2.length(v)
  74. v.x = math.cos(value) * len
  75. v.y = math.sin(value) * len
  76. return v
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement