def update(self, flower, bees):
scale = 3.0
radius_repel = 3.0 * scale
radius_align = 25.0 * scale
radius_attract = 100.0 * scale
social_strength = 0.5
nearestBeeDistTo = float("inf")
NearestBeeVecTo = pygame.Vector2(0.0, 0.0)
NearestBeeDir = pygame.Vector2(0.0, 0.0)
ToFlower_vec = pygame.Vector2(0.0, 0.0)
ToHive_vec = pygame.Vector2(0.0, 0.0)
social_vec = pygame.Vector2(0.0, 0.0)
NearestBeeStatus = None
# Der Vektor von der Biene zur Blume
flower_pos = pygame.math.Vector2(flower.rect.center[0], flower.rect.center[1])
# TODO solange blumen radius auch nicht über torus verläfut macht das keinen Unterschied
# ob Biene über torus oder nicht
to_flower = utils.nearest_vector(self.float_rect, flower_pos)
# if(flower != self.lastflower):
_len = to_flower.length()
# else:
# _len = Bee.RADIUS+1
# Biene stirbt nach gewisser Zeit
if time.time() - self.STARTTIME >= self.lebensdauer:
self.die()
print("die", self.hive.name, self.hive.livingBees)
# alle bienen durchgehen um nächste zu finden
for bee in bees:
BeeVecTo = (
bee.float_rect - self.float_rect
) # Vector zur gerade betrachteten Biene
BeeDistTo = BeeVecTo.length()
if BeeDistTo < nearestBeeDistTo and BeeDistTo > 0:
NearestBeeVecTo = BeeVecTo
nearestBeeDistTo = BeeDistTo
NearestBeeDir = bee.dir
NearestBeeStatus = bee.status
# ich weiß das ist voll schlecht so aber mir fällt grad nichts besseres ein
# ignoriert bienen anderen typs wenn IGNOREOTHERS = True
# imo etwas sinnvoller denn, warum sollten suchende bienen anderen zum hive folgen
# keine so großes Chaos bei hoher social_strength
if config.IGNOREOTHERS:
if self.status == NearestBeeStatus:
if (
nearestBeeDistTo < radius_attract
and nearestBeeDistTo > radius_align
):
social_vec = NearestBeeVecTo.normalize()
if nearestBeeDistTo < radius_align and nearestBeeDistTo > radius_repel:
social_vec = NearestBeeDir
else:
if nearestBeeDistTo < radius_attract and nearestBeeDistTo > radius_align:
social_vec = NearestBeeVecTo.normalize()
if nearestBeeDistTo < radius_align and nearestBeeDistTo > radius_repel:
social_vec = NearestBeeDir
if nearestBeeDistTo < radius_repel:
social_vec = -NearestBeeVecTo.normalize()
# falls der Vektor zur Blume <= des Blumen Radius entspricht
# und die Biene neutral ist, fliegt die Biene zur Blume
if _len <= Bee.RADIUS and self.status == "neutral":
ToFlower_vec = to_flower / _len * min(_len, Bee.SPEED)
# print(ToFlower_vec)
self.image.fill(Bee.ATTRACTED_COLOR)
# Ist sie nah genug dran, ändere den status und die Biene fliegt
# zurück zum hive
if _len < 20:
self.status = "return"
# Biene erhält Nahrung --> lebensdauer verlängern
self.lebensdauer += 5
self.lastflower = flower
# Die Bewegung der Biene entschieden durch übergebene Argumente
# während sie neutral ist
# elif self.status == "neutral":
# Hier ist de Status return und die Biene fliegt zu ihrem hive zurück:
# ['self.hive']
# ist config.ENDLESS = True ist status "neutral" wenn Bienen Hive erreichen
elif self.status == "return":
self.image.fill(Bee.RETURN_COLOR)
to_hive = pygame.math.Vector2((self.hive.rect.center) - self.float_rect)
if to_hive.length() > 5:
ToHive_vec = (
to_hive / to_hive.length() * min(to_hive.length(), Bee.SPEED)
)
elif config.ENDLESS:
self.status = "neutral"
self.image.fill(Bee.NEUTRAL_COLOR)
self.hive.pollen += 1
self.dir = pygame.math.Vector2(
uniform(-1.0, -1.0), uniform(-1.0, -1.0)
).normalize()
# Move Bee
social_vec *= social_strength
self.dir = (self.dir + social_vec + ToFlower_vec + ToHive_vec).normalize()
self.float_rect += Bee.SPEED * self.dir
self.tp()