65
Εάν δεν εντοπιστεί κάποια σύγκρουση, η θέση του εχθρού ενημερώνεται, επιτρέποντάς του να
προσεγγίσει τον παίκτη. Αντίθετα, εάν ο παίκτης βρίσκεται εκτός εμβέλειας, ενεργοποιείται η
random_move() για να κινηθεί τυχαία. Αυτή η συμπεριφορά προσδίδει έναν πιο αληθοφανή
χαρακτήρα στους εχθρούς, καθιστώντας τους πιο απρόβλεπτους στην κίνηση και την
αλληλεπίδραση τους με τον παίκτη.
def move_towards_player(self, player_pos, frame_time, chat_active, obstacles):
global Follow
if chat_active:
return
direction = player_pos - self.pos
distance = direction.length()
if distance < self.tile_size * 10:
if distance != 0:
direction = direction.normalize()
target_pos = self.pos + direction * self.speed * frame_time
if not self.collides_with_obstacle(target_pos, obstacles):
self.pos = target_pos
Follow = True
else:
self.random_move(frame_time, self.tile_size * 40, self.tile_size * 20, obstacles)
Follow = False
Η respawn(self, map_size, obstacles) είναι υπεύθυνη την επανεμφάνιση respawn του
εχθρού σε τυχαία θέση στον χάρτη, διασφαλίζοντας ότι δεν θα προκύψουν συγκρούσεις με
εμπόδια. Αρχικά, δημιουργούνται τυχαίες συντεταγμένες x και y που βρίσκονται εντός των
ορίων του χάρτη χρησιμοποιώντας τη συνάρτηση random.randint(). Αυτές οι συντεταγμένες
αποθηκεύονται ως διάνυσμα random_pos. Στη συνέχεια, δημιουργείται ένα ορθογώνιο
enemy_rect που αποτελεί τον χώρο που καταλαμβάνει ο εχθρός στην τυχαία θέση. Με τη χρήση
της colliderect() ελέγχεται αν το enemy_rect συγκρούεται με κάποιο από τα ορθογώνια
obstacle_rect) των εμποδίων. Εάν δεν εντοπιστεί σύγκρουση, η νέα θέση self.pos ενημερώνεται
και η διαδικασία σταματά. Μετά την επιτυχή επανεμφάνιση, το self.collision_timer μηδενίζεται
και ο εχθρός ενεργοποιείται.
def respawn(self, map_size, obstacles):
while True:
x = random.randint(0, (map_size - 1) * 40)
y = random.randint(0, (map_size - 1) * 40)
random_pos = pygame.Vector2(x, y)
#make sure enemy collides with obstacles
enemy_rect = pygame.Rect(random_pos.x, random_pos.y, self.tile_size * 2,
self.tile_size * 2)
if not any(enemy_rect.colliderect(obstacle['obstacle_rect']) for obstacle in obstacles):
self.pos = random_pos
print(f"Enemy respawned at {self.pos}")
break #stop when a valid position is found
self.collision_timer = 0
self.active = True