Вопросы по GDScript

Общие вопросы по скриптовому языку программирования GDScript.
Правила форума
Читайте Правила общения
Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Вопросы по GDScript

Сообщение Sansuli »

Задавайте вопросы по GDScript.
ps
Я пока ничего не знаю о нем)

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

Как поставить задержку в скрипте? Типа wait()/waitms()

Аватара пользователя
✪nobody_here✪
Добрый модератор
Сообщения: 45
Зарегистрирован: 26 май 2020, 18:18
Откуда: Spb, Ru
Благодарил (а): 7 раз
Поблагодарили: 24 раза
Контактная информация:

Re: Вопросы по GDScript

Сообщение ✪nobody_here✪ »

нода timer
:arrow: 2d master-lame-master :ugeek:
мой проект: https://n0b0dyhere.itch.io/rocket-cyborg

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

Создал генератор тайл карты, есть основные тайлы и тайлы маски, которые надо бы наложить на основные тайлы, а как можно генерировать маску для тайлов, чтобы они друг на друга накладывались? Можно ли заспавнить спрайт на тайл карту? Или возможно ли заспавнить 2 и более тайлов на 1 место
Добавлено:
Пример есть тайл луг, а на нем могут быть объекты (река, дом, лес, животные и т.п), желательно чтобы каждый объект был на свем слое.
1 слой - сам тайл "луг"
2 слой - река и лес, просто река или просто лес
3 слой - животные
4 слой - строения
Я думал над тем чтобы создавать каждый возможный вариант тайла, но это слишком много надо вариантов создать, тем более есть несколько вариантов рек, много вариантов строений, если на друг друга помножить только 1 тайл луг надо создать тучу. И чтобы это еще можно былло вписать в генератор.
Последний раз редактировалось Sansuli 11 июн 2020, 15:33, всего редактировалось 2 раза.

Аватара пользователя
SkanerSoft
Администратор
Сообщения: 100
Зарегистрирован: 23 май 2020, 20:08
Откуда: Питер
Благодарил (а): 18 раз
Поблагодарили: 43 раза
Контактная информация:

Re: Вопросы по GDScript

Сообщение SkanerSoft »

Sansuli писал(а):
11 июн 2020, 13:10
Создал генератор тайл карты, есть основные тайлы и тайлы маски, которые надо бы наложить на основные тайлы, а как можно генерировать маску для тайлов, чтобы они друг на друга накладывались? Можно ли заспавнить спрайт на тайл карту? Или возможно ли заспавнить 2 и более тайлов на 1 место
Постараюсь привести человека, который работал с тайлами!
Автор и ведущий канала Godot 3D Russia

Аватара пользователя
$noname-
Свой человек
Сообщения: 82
Зарегистрирован: 27 май 2020, 15:44
Откуда: Almaty
Благодарил (а): 12 раз
Поблагодарили: 46 раз
Контактная информация:

Re: Вопросы по GDScript

Сообщение $noname- »

а как можно генерировать маску для тайлов, чтобы они друг на друга накладывались? Можно ли заспавнить спрайт на тайл карту? Или возможно ли заспавнить 2 и более тайлов на 1 место
1) Можно, сперва советую определится с тем что именно у тебя будет двигаться, мир или персонаж. Если вариант 1 то:
Сделай синглтон на котором будет записан скорость движения мира, потом при каких координатах она будет уничтожатся(free.queue()), и всем сценам дай скорость из синглтона. Если вариант 2 то немного сложнее и вариантов побольше будет, вот самый простой на мой взгляд:
2) У всех сцен длина должна быть одинаковой(если они относятся к миру(карте)) и прикрепи скрипт отвечающий за их спавн если игрок в определенной дистанции. ПРИМЕР:
У всех сцен прикреплен скрипт который дает сигнал спавна на спавнер(например через синглтон) если игрок отошел от начала данной сцены на 500 пикселей(или юнитов) и при спавне 5ой сцены уничтожается 1. Что-то подобное на юнити есть в ютубе(Процедурная генерация на юнити вроде) Там куча ньюансов, например если игрок пошел обратно то как заспавнить предыдущую и.т.п. Поэтому советую вариант 1 т.к она проще в реализации и изучении.
Сцены - сцены в годот это префабы на юнити, сценой может называться не только уровень но и персонажи или игровые объекты
Just $noname-

Аватара пользователя
✪nobody_here✪
Добрый модератор
Сообщения: 45
Зарегистрирован: 26 май 2020, 18:18
Откуда: Spb, Ru
Благодарил (а): 7 раз
Поблагодарили: 24 раза
Контактная информация:

Re: Вопросы по GDScript

Сообщение ✪nobody_here✪ »

2 способ что ты описал - называется реализация с помощью чанков
:arrow: 2d master-lame-master :ugeek:
мой проект: https://n0b0dyhere.itch.io/rocket-cyborg

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

$noname- писал(а):
11 июн 2020, 15:20
а как можно генерировать маску для тайлов, чтобы они друг на друга накладывались? Можно ли заспавнить спрайт на тайл карту? Или возможно ли заспавнить 2 и более тайлов на 1 место
1) Можно, сперва советую определится с тем что именно у тебя будет двигаться, мир или персонаж. Если вариант 1 то:
Сделай синглтон на котором будет записан скорость движения мира, потом при каких координатах она будет уничтожатся(free.queue()), и всем сценам дай скорость из синглтона. Если вариант 2 то немного сложнее и вариантов побольше будет, вот самый простой на мой взгляд...
Такой вариант не подойдет, генератор будет работать только 1 раз при создании карты, то есть при начале игры. Игры стратегия пошаговая, карта будет определенного размера и в дальнейшем его размер будет не изменным, но тайлы далее должен изменять игрок. Вот только я еще не знаю как сделать так чтобы можно было управлять нескольками юнитами, везде уроки где делают супер марио, изометрическую рпг или трехмерную игрушку.
Я уже создал модель генератора, работаю над логикой ИИ и вариантами развития, но пока это только в тексте, простейший вариант генератора я уже реализовал в коде, но для дальнейшего ветвления мне нужно решить вышесказанную задачу.
Игра по сути копия Civilization, но с большими отличиями, мои тайлы не шестигранные, а квадратные, другая механика развития цивилизации, и много других нюансов, хочу сделать ИИ не просто ботами которые рождают скриптовых юнитов из нечего с непонятной логикой как в циве, а реально играющих ботов.
Я раньше работал над созданием ботов-автокликеров для онлайн проектов, так же создавал моды к скайриму, знаю их язык скриптования даже делал уроки (https://modgames.net/forum/110-12978-1), немного знаком с языком C++ и Basic. Это я к тому что над логикой кода я имею представление.

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

Я нашел решение.
https://godotengine.org/qa/13694/tilema ... s-of-tiles
Достаточно было создать новый tilemap с тем же tilesetом и в генераторе спавнить 2 слой тайлов на 2 тайлмэп, таким образом можно сделать несколько слоев.

Рандомайзер чисел может работать самостоятельно, без создания var rng = RandomNumberGenerator.new()
Просто не привычно что нужно создавать новый объект чтобы работал генератор.

Аватара пользователя
$noname-
Свой человек
Сообщения: 82
Зарегистрирован: 27 май 2020, 15:44
Откуда: Almaty
Благодарил (а): 12 раз
Поблагодарили: 46 раз
Контактная информация:

Re: Вопросы по GDScript

Сообщение $noname- »

Игры стратегия пошаговая, карта будет определенного размера и в дальнейшем его размер будет не изменным, но тайлы далее должен изменять игрок.
В англоязычном ютубе был вроде проект по созданию РПГ где есть сражения итд на годо
Just $noname-

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

можно ли покинуть все циклы, к примеру break останавливает только цикл в котором находится, а как остановить цикл в котором находится цикл с break? Без финтов не обойтись?
И как превратить отрицательное число в положительное? Есть ли аналог math.abs() как в джаваскрипт?

Аватара пользователя
WarThunder
Интересующийся
Сообщения: 48
Зарегистрирован: 29 май 2020, 09:38
Откуда: Россия, Краснодар
Благодарил (а): 24 раза
Поблагодарили: 12 раз

Re: Вопросы по GDScript

Сообщение WarThunder »

Sansuli писал(а):
11 июн 2020, 22:41
можно ли покинуть все циклы, к примеру break останавливает только цикл в котором находится, а как остановить цикл в котором находится цикл с break? Без финтов не обойтись?
И как превратить отрицательное число в положительное? Есть ли аналог math.abs() как в джаваскрипт?
Не совсем понял что именно тебе нужно в циклах(намёк на "код в студию"). Наверно, я бы сделал переменную-флаг, это в целом, решение многих проблем для программиста)
Про число: ну, в целом можно сделать такой финт a = a*-1(переменную А умножить на минус1). Это работает при любом переходе(из минуса в плюс и наоборот). Конкретно для перехода из минуса в плюс можно использовать такой вариант: a = abs(a) (выдаст модуль числа А). Но вообще это функция из питона, надо будет документацию годот глянуть.
P.s я всё это говорю без знаний конкретно GDScript, но полагаясь на свой опыт в Python

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

WarThunder писал(а):
11 июн 2020, 23:33
Sansuli писал(а):
11 июн 2020, 22:41
можно ли покинуть все циклы, к примеру break останавливает только цикл в котором находится, а как остановить цикл в котором находится цикл с break? Без финтов не обойтись?
И как превратить отрицательное число в положительное? Есть ли аналог math.abs() как в джаваскрипт?
Не совсем понял что именно тебе нужно в циклах(намёк на "код в студию"). Наверно, я бы сделал переменную-флаг, это в целом, решение многих проблем для программиста)
Про число: ну, в целом можно сделать такой финт a = a*-1(переменную А умножить на минус1). Это работает при любом переходе(из минуса в плюс и наоборот). Конкретно для перехода из минуса в плюс можно использовать такой вариант: a = abs(a) (выдаст модуль числа А). Но вообще это функция из питона, надо будет документацию годот глянуть.
P.s я всё это говорю без знаний конкретно GDScript, но полагаясь на свой опыт в Python
Проверил, есть такое https://docs.godotengine.org/en/stable/ ... thod-round, а на счет выхода из цикла ты правильно понял, придется делать флаг

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

Реакция на "код в студию":-) Вот код генератора над которым я работаю. Пока что умеет только генерировать тайлы земли по спирали от заданной точки.
*** Спойлер ***

Код: Выделить всё

extends Node2D
var rng = RandomNumberGenerator.new()

var map_x = 61
var map_y = 61
var land_persent = map_x * map_y * 0.33
var count1 = 0
var plus_minus = 1
var gen_cyc = 1
var mapx = 31
var mapy = 31
var land_cell_count = 1
var land_cell_count2 = 1

func _ready():
    map_gen()

func map_gen():
    for for_x in map_x:
        for for_y in map_y:
            #rng.randomize()
            #if 0.5 <= rng.randf_range(0, 1.0):
            $Testmap.set_cell(for_x,for_y,1)
    for cyc1 in (map_x * map_y):
        if plus_minus == 1:
            for cyc in gen_cyc:
                if land_cell_count < land_persent:
                    mapy += 1
                    land_spwner()
                    if land_cell_count >= land_persent:
                        break
            for cyc in gen_cyc:
                if land_cell_count < land_persent:
                    mapx += 1
                    land_spwner()
                    if land_cell_count >= land_persent:
                        break
            plus_minus = 0
            gen_cyc += 1
        elif plus_minus == 0:
            for cyc in gen_cyc:
                if land_cell_count < land_persent:
                    mapy -= 1
                    land_spwner()
                    if land_cell_count >= land_persent:
                        break
            for cyc in gen_cyc:
                if land_cell_count < land_persent:
                    mapx -= 1
                    land_spwner()
                    if land_cell_count >= land_persent:
                        break
            plus_minus = 1
            gen_cyc += 1

func land_spwner():
    $Testmap.set_cell(mapx,mapy,0)
    land_cell_count += 1

Аватара пользователя
$noname-
Свой человек
Сообщения: 82
Зарегистрирован: 27 май 2020, 15:44
Откуда: Almaty
Благодарил (а): 12 раз
Поблагодарили: 46 раз
Контактная информация:

Re: Вопросы по GDScript

Сообщение $noname- »

Sansuli писал(а):
12 июн 2020, 00:07
Реакция на "код в студию":-) Вот код генератора над которым я работаю. Пока что умеет только генерировать тайлы земли по спирали от заданной точки.
*** Спойлер ***

Код: Выделить всё

extends Node2D
var rng = RandomNumberGenerator.new()

var map_x = 61
var map_y = 61
var land_persent = map_x * map_y * 0.33
var count1 = 0
var plus_minus = 1
var gen_cyc = 1
var mapx = 31
var mapy = 31
var land_cell_count = 1
var land_cell_count2 = 1

func _ready():
    map_gen()

func map_gen():
    for for_x in map_x:
        for for_y in map_y:
            #rng.randomize()
            #if 0.5 <= rng.randf_range(0, 1.0):
            $Testmap.set_cell(for_x,for_y,1)
    for cyc1 in (map_x * map_y):
        if plus_minus == 1:
            for cyc in gen_cyc:
                if land_cell_count < land_persent:
                    mapy += 1
                    land_spwner()
                    if land_cell_count >= land_persent:
                        break
            for cyc in gen_cyc:
                if land_cell_count < land_persent:
                    mapx += 1
                    land_spwner()
                    if land_cell_count >= land_persent:
                        break
            plus_minus = 0
            gen_cyc += 1
        elif plus_minus == 0:
            for cyc in gen_cyc:
                if land_cell_count < land_persent:
                    mapy -= 1
                    land_spwner()
                    if land_cell_count >= land_persent:
                        break
            for cyc in gen_cyc:
                if land_cell_count < land_persent:
                    mapx -= 1
                    land_spwner()
                    if land_cell_count >= land_persent:
                        break
            plus_minus = 1
            gen_cyc += 1

func land_spwner():
    $Testmap.set_cell(mapx,mapy,0)
    land_cell_count += 1
Советую экспортировать значения map_x и map_y(export map_x) чтобы проще было менять и калибровать во время генерации мира, а еще мне не понятен имя переменной plus_minus. Если работаешь 1 то это конечно не важно, главное чтоб она делала свою работу
Just $noname-

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

$noname- писал(а):
12 июн 2020, 07:11
Советую экспортировать значения map_x и map_y(export map_x) чтобы проще было менять и калибровать во время генерации мира, а еще мне не понятен имя переменной plus_minus. Если работаешь 1 то это конечно не важно, главное чтоб она делала свою работу
Хм не знал что есть такое, удобно.

Переменная plus_minus работает как bool, ведь генерация идет по спирали для этого надо поочередно либо прибавлять либо отнимать. Принцип такой, сначало +x идем направо, потом +y идем вниз, затем x-- идем два раза налево, y-- два раза вверх, затем снова x+++ три раза направо и так далее.

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

Нашел кое что получше, зачем изобретать велосипед, лучше модифицировать готовое

Это код из видео
*** Спойлер ***

Код: Выделить всё

extends Node2D

enum Tiles{Land, Water}

var current_map_size = Vector2(50,50)
export (float, 0.0, 100.0) var percentage_floors

var neighboor_dir = [Vector2(1,0),Vector2(1,1),Vector2(0,1),Vector2(-1,0),Vector2(-1,-1),Vector2(0,-1),Vector2(1,-1),Vector2(-1,1)]

func _ready():
	randomize()
	make_map()

func _process(delta):
	if Input.is_action_just_pressed("ui_accept"):
		smooth_map()
	#if Input.is_action_just_pressed("ui_up"):

func make_map():
	for x in range(1, current_map_size.x - 1):
		for y in range(1, current_map_size.y - 1):
			var num = rand_range(0.0, 100.0)
			if num < percentage_floors:
				set_cell(x,y,Tiles.Water)
			else:
				set_cell(x,y,Tiles.Land)
	for x in [0, current_map_size.x - 1]:
		for y in current_map_size.y:
			set_cell(x,y, Tiles.Land)
	for x in current_map_size.x:
		for y in [0, current_map_size.y - 1]:
			set_cell(x,y, Tiles.Land)

func smooth_map():
	for x in range(1, current_map_size.x - 1):
		for y in range(1, current_map_size.y - 1):
			var number_of_neighbor_walls = 0
			for direction in neighboor_dir:
				var current_tile = Vector2(x,y) + direction
				if get_cell(current_tile.x, current_tile.y) == Tiles.Land:
					number_of_neighbor_walls += 1
			if number_of_neighbor_walls > 4:
				set_cell(x,y, Tiles.Land)
			elif number_of_neighbor_walls < 4:
				set_cell(x,y, Tiles.Water)

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

Как создать рандом из выбранных чисел, randi_range не работает в классе Node2D?

Решил быстро
var rng = RandomNumberGenerator.new()

потом
rng.randi_range()

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

какой алгоритм кода сделать чтобы отделить океан от озер, надо к примеру перекрасить озера в другой цвет. Сложность в том что карта генерирует все случайно, озера где угодно, любого размера и формы. Как их найти и закрасить?
Изображение

Вроде придумал, потом надо исполнить в коде. Создаем тайлмэп-маску где закрашиваем всю воду. По порядку начинаем удалять любой тайл граничащий с пустым местом и/или водой, то есть сначала с краями карты, а потом и с самими удаленными тайлами. Так будет цепная реакция и останутся тока слой маска над озерами. Надеюсь сработает как надо.
Еще зону континентального климата надо придумать.

Sansuli
Интересующийся
Сообщения: 40
Зарегистрирован: 09 июн 2020, 02:46
Откуда: Бишкек
Благодарил (а): 9 раз
Поблагодарили: 25 раз

Re: Вопросы по GDScript

Сообщение Sansuli »

Отличаются ли ниженаписанные коды по затрачиванию памяти и быстродействию.
Я о том что лучше объявить переменную вне цикла и использовать в цикле или объявлять переменную в цикле, учитывая только то что переменная будет использоваться только в цикле

Код: Выделить всё

#Пример
Вариант 1:
var a = 0
for b in 1000:
	a = 1
Вариант 2:
for b in 1000:
	var a = 1
Просто кажется что в варианте 2 по логике переменную "а" цикл будет создавать при входе в круг и удалять при выходе, если это так то значит это лишние "телодвижения"?

Аватара пользователя
SkanerSoft
Администратор
Сообщения: 100
Зарегистрирован: 23 май 2020, 20:08
Откуда: Питер
Благодарил (а): 18 раз
Поблагодарили: 43 раза
Контактная информация:

Re: Вопросы по GDScript

Сообщение SkanerSoft »

Если не сложно - замерь скорость выполнения, итераций только поболее надо поставить)
Автор и ведущий канала Godot 3D Russia

Rage
Новичок
Сообщения: 5
Зарегистрирован: 01 июл 2020, 09:40
Откуда: Хилок (Заб. край)

Re: Вопросы по GDScript

Сообщение Rage »

Подскажите пожалуйста как сделать свет на кнопку?

Аватара пользователя
SkanerSoft
Администратор
Сообщения: 100
Зарегистрирован: 23 май 2020, 20:08
Откуда: Питер
Благодарил (а): 18 раз
Поблагодарили: 43 раза
Контактная информация:

Re: Вопросы по GDScript

Сообщение SkanerSoft »

Rage писал(а):
01 июл 2020, 09:46
Подскажите пожалуйста как сделать свет на кнопку?
Очень неточный вопрос) Какой свет?
Автор и ведущий канала Godot 3D Russia

Rage
Новичок
Сообщения: 5
Зарегистрирован: 01 июл 2020, 09:40
Откуда: Хилок (Заб. край)

Re: Вопросы по GDScript

Сообщение Rage »

SkanerSoft писал(а):
01 июл 2020, 10:37
Rage писал(а):
01 июл 2020, 09:46
Подскажите пожалуйста как сделать свет на кнопку?
Очень неточный вопрос) Какой свет?
Ну например на машине при нажатии на кнопку загорается свет

Rage
Новичок
Сообщения: 5
Зарегистрирован: 01 июл 2020, 09:40
Откуда: Хилок (Заб. край)

Re: Вопросы по GDScript

Сообщение Rage »

Я сделал на машине так чтобы свет загорался, но он не так работает

Ответить