background image

 

 

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(), 

υπολογίζεται η νέα θέση και πραγματοποιείται έλεγχος για πιθανές συγκρούσεις με εμπόδια.