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.")