Перейти к основному содержимому
The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.

Кастомные спрайты

Добавляем спрайты как ресурсы

Во-первых, кодируйте ваши изображения в PNG или JPG формате, а аудиоклипы в MP3, OGG или WAV.

Потом перейдите в Свойства вашего проекта и создайте файл ресурсов, если его там нету.

Откройте Resources.resx в вашем проекте в стороннем редакторе и добавьте следующий элемент в конец:

  <!-- ... -->
<data name="MyAwesomeSprite" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\MyAwesomeSprite.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

Вам надо только изменить атрибут name и первую часть элемента value для ваших ресурсов. После этого вы сможете обращаться к ним так: Properties.Resources.MyAwesomeSprite. Вы можете делать то же самое и с другими типами файлов, например аудиоклипами, шрифтами и моделями.

После изменения .resx файла, перейдите в своё решение и перестройте код ресурсов, нажав правой кнопкой по Resources.resx и выбрав "Run Custom Tool".

RogueSprite

примечание

Если вам интересно, почему он называется RogueSprite, а не CustomSprite, как почти все остальные штуки в RogueLibs (CustomItem, CustomTrait, CustomEffect), ну что ж, это потому что он ведёт себя немного по-другому. CustomItem, CustomTrait и др. - хуки, в то время как RogueSprite, технически, коллекция хуков. А ещё, я потратил невероятное количество времени и работы, чтобы разобраться в этой TK2D ерунде и я просто хотел отличить его от других классов.

Обычно, новые RogueSprite создаются вот так:

RogueLibs.CreateCustomItem<MyCustomItem>()
...
.WithSprite(Properties.Resources.MyCustomItem);

Но вы можете создать их напрямую тоже, но в таком случае вам придётся указать название и область действия. Область действия спрайта определяет в каких областях игры спрайт будет доступен. SpriteScope.Items будет работать только на предметах, SpriteScope.Objects - только на объектах, и т.д. Вы можете указать несколько областей тоже, объединив их с помощью оператора |.

RogueLibs.CreateCustomSprite("name", SpriteScope.Items, Properties.Resources.ResourceName);

По умолчанию, RogueLibs использует весь файл для текстуры. Вы можете указать нужную область текстуры Rect параметром:

RogueLibs.CreateCustom("name", SpriteScope.Items, Properties.Resources.ResourceName,
new Rect(0f, 0f, 64f, 64f));

Если вы используете текстуры размером, отличающимся от 64x64, то вам также надо указать PPU (pixels-per-unit) параметр:

RogueLibs.CreateCustom("name", SpriteScope.Items, Properties.Resources.ResourceName,
new Rect(64f, 64f, 128f, 128f), 128f);

Различные спрайты

Если у вашего предмета более одного спрайта, используйте InvItem.LoadItemSprite в SetupDetails вашего предмета:

public class Present : CustomItem, IItemUsable
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomItem<Present>()
/* ... */
.WithSprite(Properties.Resources.Present);

RogueLibs.CreateCustomSprite("Present2", SpriteScope.Items, Properties.Resources.Present2);
RogueLibs.CreateCustomSprite("Present3", SpriteScope.Items, Properties.Resources.Present3);
}

public override void SetupDetails()
{
/* ... */
int rnd = new Random().Next(3) + 1;
// случайное целое число x, такое что 1 ≤ x ≤ 3

if (rnd != 1) // загрузить другой спрайт, если это 2 или 3
Item.LoadItemSprite($"Present{rnd}");

// если это 1, спрайт "Present" будет использован по умолчанию
}
}

Этот пример работает только если предмет действительно существует. В Обвесе и Меню наград у него всегда будет спрайт Present. Если вы хотите чтобы спрайт в меню также случайно выбирался, вам придётся перегрузить метод DisplayedUnlock.GetImage.

The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.