background image

 

 

62 

 

def 

set_obs 

(topic,sector_x, 

sector_y, 

sector_width, 

sector_height, 

tile_size,npc_x,npc_y,obstacles): 

    #the number of obstacles per sector 
    num_obstacles = random.randint(30, 40) 
    for _ in range(num_obstacles): 

obstacle_image_path=resource_path(f"sprites/obs/{topic}/obs{   
random.randint(1, 4)}.png") 

      obstacle_image=pygame.image.load   
       (obstacle_image_path).convert_alpha() 

        #get the size of each obstacle from its image dimensions 
        obstacle_width, obstacle_height = obstacle_image.get_size() 
  

  

  

  

obstacle_x, 

obstacle_y 

random_obs_pos(sector_x, 

sector_y,   

sector_width,sector_height,max(obstacle_width,obstacle_height),pygame.Vector2(npc_x,npc_y),til

e_size,existing_obstacles=[obs['obstacle_rect'] 

for 

obs 

in 

obstacles],min_distance=5, 

min_obstacle_distance=10) 
  

  

  

  

obstacles.append({'obstacle_rect': 

pygame.Rect(obstacle_x, 

obstacle_y,obstacle_width,obstacle_height),'obstacle_image': 

pygame.transform.scale(obstacle_image,(obstacle_width, obstacle_height)),}) 

Η συνάρτηση random_obs_pos έχει ως σκοπό να βρει μια έγκυρη τυχαία θέση για τοποθέτηση 

ενός νέου εμποδίου στον χάρτη, διασφαλίζοντας ότι δεν θα συμπίπτει με NPCs ή άλλα εμπόδια. 

Ορίζει ένα περιθώριο γύρω από τα όρια του  τομέα για να αποφεύγεται η τοποθέτηση πολύ 

κοντά  στα  σύνορα  του  τομέα.  Επίσης,  μετατρέπει  τις  αποστάσεις  από  tiles  σε  pixels, 

προκειμένου να υπολογίσει τη θέση με μεγαλύτερη ακρίβεια. Η συνάρτηση προσπαθεί να βρει 

μια έγκυρη θέση με μέγιστο αριθμό προσπαθειών τις 100. Εάν η νέα θέση είναι πολύ κοντά 

στον NPC, απορρίπτεται και η συνάρτηση επαναλαμβάνει την διαδικασία με νέα τυχαία θέση. 

Επιπλέον, ελέγχει εάν η θέση αυτή είναι πολύ κοντά σε υπάρχοντα εμπόδια στον τομέα και την 

απορρίπτει. Αν βρεθεί μια έγκυρη θέση, η συνάρτηση επιστρέφει τις συντεταγμένες της.  

def random_obs_pos(x_start, y_start, sector_width, sector_height, max_size, npc_pos, tile_size, 
existing_obstacles, min_distance=10, min_obstacle_distance=10): 

    margin = 2 * max_size  #make sure obstacles are placed within the sector's bounds 
    min_distance_px = min_distance * tile_size 
    min_obstacle_distance_px = min_obstacle_distance * tile_size 
    #make up to 100 attemps to find a valid position 

    for _ in range(100):   
        x=random.randint(x_start+margin,x_start+sector_width-  
        margin-max_size) 
        y=random.randint(y_start+margin,y_start+sector_height-   

        margin-max_size) 
        obstacle_pos = pygame.Vector2(x, y)        #check the distance from each sectors npc 
        if obstacle_pos.distance_to(npc_pos) < min_distance_px: 

            continue 
   #check the distance from the existing obstacles in the sector 
        valid = True 
        for obs in existing_obstacles: 

           if obstacle_pos.distance_to(pygame.Vector2(obs.center)) < min_obstacle_distance_px: 
                valid = False 
                break 
        if valid:   

            return x, y  #return the valid position 
    raise ValueError("Could not find a position for the obstacle.")