Кожи

Кожите са разпространен метод за промяна на външния вид на програма. На практика това са набор от картинки използвани за различните елементи в потребителския интерфейс.

При YSokoban това са картинки които се използват за визуализиране на различните елементи от нивото: стена, празно място, работник, сандък ...

Функционалните клавиши F3, F4, ... F8 превключват между различни кожи, за всеки клавиш може да се дефинира към коя кожа да се превключи.

YSokoban може автоматично да променя размера на кожите, но малките кожи не изглеждат добре когато се уголемят. По-добре е да се ползва голяма кожа която да се намалява. Затова всички кожи с размер (на клетката) по-голям от 40 се считат за преоразмеряеми.

Следните клавиши контролират преоразмеряването на кожите:

key action
* Включва/изключва преоразмеряването.
= Изключва преоразмеряването и връща размера на кожата към нейния нормален размер.
# или ` Сменя алгоритъма за преоразмеряване (има два такива алгоритъма, може да експериментирате кой е по-подходящ за текущата кожа).
- или [ Изключва преоразмеряването и намалява размера на кожата с 1 пиксел
+ или ] Изключва преоразмеряването и увеличава размера на кожата с 1 пиксел
S или A Избира друга възможна кожа от поддиректорията с кожи. A/S сменя предишна/следваща кожа.

Диалог за настройка на кожите

Активира се от main menu -> Кожи. В появилия се диалог може да се изберат кожите (bmp или png файлове), които ще се ползват при различните функционални клавиши.

Другите възможни настройки имат следното значение:

(в стандартната кожа на YSokoban, те са бели) или може да бъде (с тази настройка) да показва линии вместо точки.

Пример: Показване/скриване на мрежата (може да пробвате със стандартната кожа, като натиснете F7 и ctrl-F7 за скриване/показване на мрежата):

Описание на файловете за кожа

Кожите за YSokoban в началото бяха единичен BMP файл (стандартен формат за картинки под Windows). Идеята бе да са колкото може по-прости и да се състоят по възможност от един файл, така че да не се налага на потребителя да се грижи за поддиректории и различни файлове в тях.

Понастоящем има два формата за кожи: стар и нов. Практически всички кожи от стария формат са прехвърлени към новия, така че описанието на старите кожи се дава само за пълнота.

Стария формат за кожи

Това от което YSokoban има нужда за да покаже нивото са картинки на следните клетки:

В YSokoban е възможно да се избере сандък (или работника) и той да бъде преместен автоматично. Затова YSokoban се нуждае да маркира (визуално) избрания обект. Най-добре е това да стане с анимация. Когато нивото е завършено тази анимация се използва за всички обекти.

Всички стени (в стария формат) са представебу чрез 16 възможни изображения.

За анимациите YSokoban използва по един ред за всеки обект - работник, работник върху цел, сандък, сандък върху цел. Това означава 4 реда. Първите два реда се използва за празна клетка, работник в празна клетка, сандък в празна клетка. На следващия ред са клетка цел, работник върху цел, сандък върху цел (на мястото си). Двете неизползвани клетки (в края на горните два реса) се ползва за да изобразяване на невалидни сандъци (на празно и върху цел).

По-късно стана ясно, че има нива, които не могат да се покажат добре с този тип кожа. Например:

Например вижте как изглежда следното ниво

########
#-.--$-#
#-####-#
#-####-#
#-####-#
#----@-#
########

със стария формат кожи (в ляво) и с новия (в дясно):

Новия формат за кожи

Новия формат беше направен за да може да се визуализират по-добре нивата. Сега се рисуват само съставящите части на стените и програмата ги комбинира за да получи пълния набор от клетки със стена (които са 47, като добавим и още 7 за работник, сандък, ... получаваме общо 54 клетки).

Новия формат има същите клетки като стария, с изключение на стените (които са напълно променени). По точно имаме следното:

Анимациите се изпълняват като кадрите се показват от ляво надясно и после се повтарят.

Конструирането на стените се прави по следния начин: Всяка стена се състои от 4 части (ако я разделим с две черти: хоризонтална и вертикална), вижте примера за кожа по-горе (номерирани са). Така че когато програмата има нужда от стена тя си я съставя като взема нужните парчета от всеки вид стена (една от 5-те нарисувани). Обикновено съставните парчета са еднакви по размер (т.е. разделителните линии се прекарват по средата на всяка клетка), но има случаи когато не са (защото стената е изместена поради светлосенки или други ефекти). Така че се нуждаем от начин да укажем как точно е разделена, т.е. колко е голяма лявата и колко горната част. За целта се ползва празна клетка (последната клетка от 2-рия ред стени), ако е пълна с еднакъв цвят - имаме разделяне на равни части, ако е има линия започваща от горния ляв ъгъл, то нейната дължина се приема за размера на лявата част на парчето от стена, както и дължината на вертикалната линия определя вертикалния размер на парчето.

Останалата част от тази клетка се ползва за маркиране на това кои клетки могат да имат мрежа в себе си. За повече информация продължете да четете следващата част по-долу.

Клетката на ред 4, колона 3 не се ползва въобще и автора на кожата си е сложил името там.

Нивото от горния пример (показано с примерната кожа), сега изглежда така (ясно си личат съставящите части от стените, както са номерирани).

Повече информация за описващата клетка

Тази информация се съдържа в клетка на ред 4, колона 4 (ако номерираме започвайки от 1, отгоре надолу и отляво надясно).

Тази клетка трябва да бъде оцветена в един и същ цвят, без значение какъв (бял, черен, червен, ...). При такова оцветяване (само 1 цвят за цялата клетка), програмата ще използва стандартните (по премълчаване) настройки за стените.

Ако се направят някой допълнителни промени по клетката може да се постигнат следните неща:

Дефиниране как да се разделят клетките за стени

Нарисувайте хоризонтална линия с размер една точка, започвайки от горния ляв ъгъл на клетката надясно. Нарисувайте и вертикална линия с размер една точка, започвайки от горния ляв ъгъл на клетката надолу.

Тези две линии в комбинация указват как да се разделят клетките със стени (по-точно дължината на хоризонталната и вертикалната линии указват къде ще се направи делението).

По премълчаване (т.е. ако няма такива линии), YSokoban ще направи разделянето по средата.

Дефиниране кои клетки ще имат мрежа и с какъв цвят

Моля сравнете "skinExample1.png" и "skinExample1_without_net_mark.png" (свалете skins_description.zip от страниците на YSokoban за кожи). По-точно сравнете най-дясната клетка от ред 4.

Двете кожи са еднакви с изключение на това, че едната може да показва мрежа, а другата не.

Областта за отбелязване кои клетки могат да имат мрежа е с размер 4x8 точки. Забележете че тази 4x8 област е извън двете линии описани по-горе (хоризонталната и вертикалната използвани за описание къде се делят стените). Ако тези две линии започват в клетката (относително клетката) на позиция (0, 0), то тогава тази област започва от позиция (1, 1). Всяка точка от тази 4x8 област отговаря на една клетка от кожата (забележете че кожата се състои от 4x8 клетки).

Точките в тази 4x8 област трябва да са със същия цвят какъвто са двете линии от по-горния раздел (за разделянето). Освен това този цвят ще се използва и като цвят за мрежата.

В skinExample1.png се указва, че всяка клетка ще има мрежа, и цвета е по-светло сиво отколкото е цвета на празната клетка.

В skinExample1_without_net_mark.png се указва, че няма да има мрежа, така че натискането на CTRL+N няма да има ефект.

Не е задължително да указвате, че всяка клетка има мрежа. В някой кожи, може да не се задава мрежа за някой клетки, предимно за тези със стените (например в sf_100z_greenRed_gray.png).

Специални RGB маркировки в кожата

YSokoban преди версия 1.805 винаги ще отказва да слага мрежа извън нивото.

От версия 1.805 YSokoban дори и в клетки извън нивото ако са направени подходящите описания. Това значи точка за ред 3, клетка 4 е сложена (ако броим редовете и колоните започвайки от 1).

Всички кожи (вече създадени) обикновено имат тази точка и поради това биха показвали мрежа извън нивото, което ще развали дизайна на някой от тях. За да се запази обратна съвместимост (с кожите създадени преди) YSokoban ще обработва тази точка само ако кожата има специална маркировка. Тази специална маркировка е по една червена, зелена и синя точка в ъглите (както е показано по-долу на картинките). Забележете подредбата на трите точки (RGB, GBR и BRG).

(RGB подредба) В този случай за клетките извън нивото също ще се използва мрежа ако е указано. Нещо повече, ще се използва цвета на точката.

(GBR подредба) Както по-горе, но допълнително всички стени от границата на нивото ще използват алтернативната стена

(BRG подредба) Както по-горе (първото), но всички вътрешни стени ще използват алтернативната стена

(BGR подредба) Както по-горното, но алтернативната стена се ползва само за плоската част на вътрешните стени (там където няма ръбове)

Тази алтернативна стена е на мястото на единствената неизползвана клетка (в която по-горе автора си беше написал името).

Още технически детайли за това как YSokoban обработва клетката с описание

YSokoban използва точка 0,0 (става дума за точката с относителни координати спрямо клетката с описание) и сканира реда и колоната (хоризонтално и вертикално). Когато достигне до точка с различен цвят то това са X и Y размерите използвани за разделяне на стените, Ако X = Y = размера на клетката (т.е. нищо не е дефинирано) тогава YSokoban решава да използва стандартното разделяне по средата.

След това се проверява за областт 4x8 от точки, за да знае кои клетки могат да имат мрежа. Това значи, че ако оставите тази област празна (т.е. запълнена с основния цвят), то това значи: разделяне на стените по средата и всички клетки ще имат мрежа.

Остатъка от клетката е неизползва. Освен ако се използва специалната RGB маркировка (описана по-горе).

В такъв случай (при RGB маркировка), то фоновия цвят се ползва от точката на позиция xsize-2, xsize-2 (ако xsize е размера на клетката). Всички точки в описателната клетка се сравняват спрямо този фонов цвят.


Благодаря на Ming за предложенията и подобренията.


Created with Ywiki