Кастомные спрайты
Добавляем спрайты как ресурсы
Во-первых, кодируйте ваши изображения в 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
.