64
def collides_with_obstacle(self, target_pos, obstacles):
target_rect = pygame.Rect(target_pos.x, target_pos.y, self.tile_size * 2, self.tile_size
* 2)
for obstacle in obstacles:
if target_rect.colliderect(obstacle['obstacle_rect']):
return True
return False
Η random_move(self, delta_time, screen_width, screen_height, obstacles) επιτρέπει
στον εχθρό να κινείται τυχαία στον χάρτη όταν δεν ανιχνεύει τον παίκτη. Κάθε
random_move_interval δευτερόλεπτα, παράγεται ένας τυχαίος προορισμός (random_target)
εντός των ορίων του χάρτη χρησιμοποιώντας τη συνάρτηση random.randint() για τη
δημιουργία συντεταγμένων. Εάν η νέα θέση δεν συγκρούεται με κάποιο εμπόδιο, ο στόχος
random_target ενημερώνεται. Ο εχθρός κατευθύνεται προς τον τυχαίο προορισμό
χρησιμοποιώντας διανύσματα: το διάνυσμα κατεύθυνσης υπολογίζεται ως direction =
self.random_target-self.pos και στη συνέχεια κανονικοποιείται direction.normalize() ώστε να
εξασφαλιστεί ομαλή κίνηση. Η θέση του εχθρού ενημερώνεται με βάση την ταχύτητά του
self.speed και τον χρόνο delta_time που έχει περάσει. Αυτή η συμπεριφορά προσδίδει το εφε
περιπλάνησης στους εχθρούς, καθιστώντας τους λιγότερο προβλέψιμους και πιο ρεαλιστικούς
στην κίνησή τους.
def random_move(self, delta_time, screen_width, screen_height, obstacles):
self.random_move_timer += delta_time
if self.random_move_timer >= self.random_move_interval:
while True:
random_target=pygame.Vector2(random.randint(0, screen_width - self.tile_size *
2),random.randint(0, screen_height - self.tile_size * 2))
if not self.collides_with_obstacle(random_target, obstacles):
self.random_target = random_target
break
self.random_move_timer = 0
direction = self.random_target - self.pos
distance = direction.length()
if distance > 0:
direction = direction.normalize()
target_pos=self.pos+direction* self.speed * delta_time
if not self.collides_with_obstacle(target_pos,
obstacles):
self.pos = target_pos
Η move_towards_player(self, player_pos, frame_time, chat_active, obstacles) ελέγχει
αν ο παίκτης βρίσκεται εντός εμβέλειας και κατευθύνει τον εχθρό προς αυτόν. Αρχικά,
υπολογίζεται το διάνυσμα κατεύθυνσης ως direction = player_pos - self.pos. Εάν η απόσταση
distance είναι μικρότερη από self.tile_size * 10, ο εχθρός ξεκινά να ακολουθεί τον παίκτη. Σε
αυτήν την περίπτωση, το διάνυσμα κατεύθυνσης κανονικοποιείται direction.normalize(),
υπολογίζεται η νέα θέση και πραγματοποιείται έλεγχος για πιθανές συγκρούσεις με εμπόδια.