Top.Mail.Ru
Ответы

Очень бесячий баг

Помогите пж. Я начинающий айтишник. Я тут решил в своём проекте сделать процедурную генерацию, однако столкнулся с косметическим, однако ооочень бесячим багом. Его вы можете увидеть на фото 1. Поясняю - когда мир создаётся, вроде бы всё номально, но тут БАЦ - внутренний угол там, где должна быть такая же плоская трава. И этот баг повторяется с каким-то расстоянием. Я уже чего только не перепробовал (нейронки особо не помогли, а иногда делали только хуже). Я работаю на годот 4.6. Я новичок на этом движке (в целом в ИТ), так что не судите строго)

extends TileMap

#Настройки мира

var width = 400

var height = 200

var noise = FastNoiseLite.new()

func _ready() -> void:

randomize()

noise.seed = randi()

noise.frequency = 0.03

generate_world()

func generate_world():

clear()

var cells_to_draw = []

#Собираем координаты в массив

for x in range(width):

var noise_val = noise.get_noise_2d(float(x),0.0)

var ground_y = int(noise_val * 10 + 20)

for y in range(ground_y, height):

cells_to_draw.append(Vector2i(x,y))

set_cells_terrain_connect(0,cells_to_draw,0,0)

Не считайте мой вопрос наглостью, просто я действительно уже не знаю что делать(

По дате
По рейтингу
Аватар пользователя
Ученик
1мес

Решение 1: Использовать обычные тайлы вместо террайна

12345678910111213141516171819202122
extends TileMap

var width = 400
var height = 200
var noise = FastNoiseLite.new()

func _ready() -> void:
	randomize()
	noise.seed = randi()
	noise.frequency = 0.03
	generate_world()

func generate_world():
	clear()
	
	# Просто устанавливаем тайлы без автоматического соединения
	for x in range(width):
		var noise_val = noise.get_noise_2d(float(x), 0.0)
		var ground_y = int(noise_val * 10 + 20)
		
		for y in range(ground_y, height):
			set_cell(0, Vector2i(x, y), 0, Vector2i(0, 0)) # Укажите правильные координаты вашего тайла

Решение 2: Правильная настройка террайна

Если хочешь оставить set_cells_terrain_connect, попробуй:

1234567891011121314
func generate_world():
	clear()
	var cells_to_draw = []
	
	for x in range(width):
		var noise_val = noise.get_noise_2d(float(x), 0.0)
		var ground_y = int(noise_val * 10 + 20)
		
		# Добавляем ВСЕ ячейки, включая границу сверху
		for y in range(ground_y, height):
			cells_to_draw.append(Vector2i(x, y))
	
	# Используем правильный слой террайна (возможно нужен 1 вместо 0)
	set_cells_terrain_connect(0, cells_to_draw, 0, 1)

Решение 3: Сглаживание шума

Проблема может быть в резких перепадах высот:

1234567
func _ready() -> void:
	randomize()
	noise.seed = randi()
	noise.frequency = 0.02 # Уменьшите частоту
	noise.fractal_octaves = 3 # Добавьте октавы для плавности
	noise.fractal_gain = 0.5
	generate_world()

Решение 4: Дополнительная обработка

12345678910111213141516171819
func generate_world():
	clear()
	var cells_to_draw = []
	var prev_y = 0
	
	for x in range(width):
		var noise_val = noise.get_noise_2d(float(x), 0.0)
		var ground_y = int(noise_val * 10 + 20)
		
		# Сглаживание резких перепадов
		if x > 0 and abs(ground_y - prev_y) > 3:
			ground_y = prev_y + sign(ground_y - prev_y) * 3
		
		for y in range(ground_y, height):
			cells_to_draw.append(Vector2i(x, y))
		
		prev_y = ground_y
	
	set_cells_terrain_connect(0, cells_to_draw, 0, 0)

Аватар пользователя
Ученик
1мес

Спасибо, попробую

Аватар пользователя
Ученик
1мес

Не помогает(



Видео по теме