Добавить число к имени переменной в GDScript

Я хотел бы добавить целое число в конец имен нескольких переменных в GDSCript.

Я работаю над roguelike и решил организовать тематические тайлсеты и NPC и сгруппировать их в папки по номерам (например, тема 1 может быть склепом, заполненным нежитью, тема 2 - лесом, заполненным животными). Идея состоит в том, что в начале генерации уровня я могу случайным образом выбрать число, сгенерировать уровень и заполнить его соответствующими врагами.

Например (при условии, что случайное число равно 1)

tileset_to_use = tileset_1
NPC_mid_boss = folder_1/mid_boss
NPC_end_boss = folder_1/end_boss

Помимо ряда вложенных операторов IF, таких как:

if RNG = 1:
    tileset_to_use = tileset_1
    NPC_mid_boss = folder_1/mid_boss
    NPC_end_boss = folder_1/end_boss
elif RNG = 2:   
    tileset_to_use = tileset_2
    etc...

... что было бы более эффективным способом сделать это? Что-то вроде tileset + RNG Я изучал использование словарей, но, если я не понял их неправильно, они, похоже, используются для доступа к значениям, а не для генерации имен переменных.


person Chris Hawkins    schedule 01.05.2019    source источник
comment
Поправьте меня, если я ошибаюсь, но разве Godot не поддерживает несколько сцен и экземпляров сцен для таких целей? Не могли бы вы попробовать сохранить свои тайловые карты как разные сцены и вызывать их случайным образом при генерации уровня?   -  person Christopher Bennett    schedule 01.05.2019


Ответы (2)


Если все ваши темы имеют одинаковую точную структуру, вы можете сделать что-то похожее на то, что предлагает Кристофер Беннетт. Другой вариант, который может дать вам больше гибкости за счет, возможно, большего количества повторений, выглядит примерно так:

# Defined at class level
const THEMES = [
    # Theme 1
    {
        tileset = 'tileset_1',
        NPC_mid_boss = 'folder_1/mid_boss',
        NPC_end_boss = 'folder_1/end_boss',
        # ...
    },
    # Theme 2
    {
        tileset = 'tileset_2',
        NPC_mid_boss = 'folder_2/mid_boss',
        NPC_end_boss = 'folder_2/end_boss',
        # ...
    },
    # ...
]


func my_func():
    # Pick a random theme
    var theme = THEMES[randi() % THEMES.size()]
    tileset_to_use = theme.tileset
    # ...

Это также позволяет вам добавлять дополнительные свойства, такие как произвольные строки (например, имя темы) или другие вещи, и их можно экстернализовать во что-то вроде документ JSON, если хотите. Но опять же, это требует большей ручной настройки.

person jdehesa    schedule 01.05.2019
comment
Мне тоже нравится это решение - выбирайте сами;) - person Christopher Bennett; 01.05.2019
comment
Спасибо вам обоим, это решение именно то, что мне было нужно. - person Chris Hawkins; 01.05.2019

Извините, мне кажется, я неправильно понял ваш вопрос, когда разместил свой первый комментарий. Хотелось бы, чтобы это сработало?

var RNG = randi()%1-(total number of tilesets); 
var tileset_to_use = (str("tileset_",RNG));  
    NPC_mid_boss = (str("folder_",RNG,"/mid_boss"));
person Christopher Bennett    schedule 01.05.2019
comment
Или проблема в том, что вы хотите, чтобы результат не был строкой. В этом случае лучше использовать словарь. Сделайте словарь var dictionary={1:tileset1, 2:tileset2,3:tileset3}. Затем установите переменную RNG=i и найдите в словаре for i in range(0-dictionary.size()): var tileset=dictionary[i]. Затем вы можете установить var tileset_to_use = tileset. - person Christopher Bennett; 01.05.2019