Amélioration de l'IA
This commit is contained in:
parent
dc37efc262
commit
ce767126d1
|
@ -1,4 +1,5 @@
|
||||||
import math
|
import math
|
||||||
|
import random
|
||||||
|
|
||||||
from src.engine.entity import Entity
|
from src.engine.entity import Entity
|
||||||
from src.engine.entity_manager import EntityManager
|
from src.engine.entity_manager import EntityManager
|
||||||
|
@ -10,18 +11,56 @@ class WolfAI(MobAI):
|
||||||
def __init__(self, entity: 'Entity', entity_manager: 'EntityManager', map_manager: 'MapManager'):
|
def __init__(self, entity: 'Entity', entity_manager: 'EntityManager', map_manager: 'MapManager'):
|
||||||
super().__init__(entity, entity_manager, map_manager)
|
super().__init__(entity, entity_manager, map_manager)
|
||||||
|
|
||||||
def update(self):
|
self.ATTACK_DISTANCE = 160
|
||||||
|
self.timer = 0
|
||||||
|
self.walk_x = 0
|
||||||
|
self.walk_y = 0
|
||||||
|
self.comportment = 0 # 0 : waiting, 1: walking
|
||||||
|
|
||||||
|
def update(self, delta: float):
|
||||||
|
"""Fonction executée à chaque tick pour chaque loup et qui gère l'IA."""
|
||||||
|
|
||||||
|
# On récupère l'entité joueur
|
||||||
player: Entity = self.entity_manager.get_by_name(self.entity_manager.player_entity_name)
|
player: Entity = self.entity_manager.get_by_name(self.entity_manager.player_entity_name)
|
||||||
|
|
||||||
|
# On calcule la distance en x et en y entre le loup et le joueur
|
||||||
x_distance = (player.x - self.entity.x)
|
x_distance = (player.x - self.entity.x)
|
||||||
y_distance = (player.y - self.entity.y)
|
y_distance = (player.y - self.entity.y)
|
||||||
|
|
||||||
|
# On calcule la distance
|
||||||
player_distance = math.sqrt(x_distance ** 2 + y_distance ** 2)
|
player_distance = math.sqrt(x_distance ** 2 + y_distance ** 2)
|
||||||
|
|
||||||
if player.ge_collisions_with_entity(self.entity):
|
# On vérifie que le loup peut voir le joueur
|
||||||
player.take_damages(1)
|
if player_distance <= self.ATTACK_DISTANCE:
|
||||||
|
# On rétablit la vitesse du loup à 1
|
||||||
|
self.entity.max_speed = 1.
|
||||||
|
|
||||||
|
# Si le loup touche le joueur, il lui inflige des dégats
|
||||||
|
if player.get_collisions_with_entity(self.entity):
|
||||||
|
player.take_damages(1)
|
||||||
|
|
||||||
|
# Si le loup n'est pas déja sur le joueur, on le fait s'en raprocher
|
||||||
|
if player_distance > self.entity.max_speed:
|
||||||
|
self.entity.move(x_distance / player_distance*self.entity.max_speed,
|
||||||
|
y_distance / player_distance*self.entity.max_speed, self.map_manager)
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Comportement d'attente
|
||||||
|
self.entity.max_speed = 0.5
|
||||||
|
|
||||||
|
self.timer -= delta
|
||||||
|
if self.timer <= 0 and self.comportment == 0:
|
||||||
|
self.comportment = 1
|
||||||
|
self.timer = random.random() * 5.
|
||||||
|
self.walk_x = (random.random()-0.5)*2
|
||||||
|
self.walk_y = (random.random()-0.5)*2
|
||||||
|
|
||||||
|
elif self.timer <= 0 and self.comportment == 1:
|
||||||
|
self.comportment = 0
|
||||||
|
self.timer = random.random() * 3
|
||||||
|
|
||||||
|
print(self.timer)
|
||||||
|
|
||||||
|
self.entity.move(self.walk_x, self.walk_y, self.map_manager)
|
||||||
|
|
||||||
|
|
||||||
if abs(player_distance) > self.entity.max_speed:
|
|
||||||
self.entity.move(x_distance / player_distance*self.entity.max_speed,
|
|
||||||
y_distance / player_distance*self.entity.max_speed, self.map_manager)
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ class Entity:
|
||||||
if self.life_points < 0:
|
if self.life_points < 0:
|
||||||
self.life_points = 0
|
self.life_points = 0
|
||||||
|
|
||||||
def ge_collisions_with_entity(self, other: 'Entity'):
|
def get_collisions_with_entity(self, other: 'Entity'):
|
||||||
"""Retourne True si l'entité courante est en collision avec l'entité donnée."""
|
"""Retourne True si l'entité courante est en collision avec l'entité donnée."""
|
||||||
return (self.x+self.collision_rect[0] <= other.x+other.collision_rect[2] and
|
return (self.x+self.collision_rect[0] <= other.x+other.collision_rect[2] and
|
||||||
self.x+self.collision_rect[2] >= other.x+other.collision_rect[0] and
|
self.x+self.collision_rect[2] >= other.x+other.collision_rect[0] and
|
||||||
|
|
|
@ -33,7 +33,7 @@ class EntityManager:
|
||||||
self.entities.pop(entity_name)
|
self.entities.pop(entity_name)
|
||||||
|
|
||||||
if entity.brain is not None:
|
if entity.brain is not None:
|
||||||
entity.brain.update()
|
entity.brain.update(delta)
|
||||||
|
|
||||||
if self.player_entity_name:
|
if self.player_entity_name:
|
||||||
player: Entity = self.get_by_name(self.player_entity_name)
|
player: Entity = self.get_by_name(self.player_entity_name)
|
||||||
|
|
Loading…
Reference in a new issue