background image

 

 

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