通过修改皮肤,可以更改歪推中的视觉元素(如墙壁、箱子、目标点、小人等)。皮肤不同,游戏的外观也有所不同。 可以对功能键F3到F8进行定义,将每个键与不同的皮肤对应起来。歪推的皮肤可以随窗口大小而自动改变。但如果皮肤不是高清,放大后清晰度就会降低。最好是使用高清皮肤,然后根据需要进行调整。默认情况下,大于40像素的所有皮肤都可以调整大小。请使用以下键进行调整: (这个文件里面, 格和单元格通用。)
键 | 操作 |
---|---|
* | 打开/关闭自动调整大小。 |
= | 关闭自动调整大小并将皮肤设置为默认大小。 |
# 或 ` | 切换自动调整大小算法(有两种可能的算法,具体取决于哪种更好)。 |
- 或 [ | 停止自动调整大小,并使用像素比当前值小1的皮肤 |
+ 或 ] | 停止自动调整大小,并使用像素比当前值大1的皮肤 |
S 或 A | 循环使用skins文件夹(YSokoban.exe所在文件夹中的的子文件夹)中的皮肤。按A/S键将向前/向后循环使用该子文件夹中的皮肤。 |
通过“主菜单 -> 皮肤”激活。此时将打开一个对话框,可以在其中定义每个功能键对应的皮肤(bmp或png文件)。通常会将皮肤复制到YSokoban所在的文件夹。
此菜单中的其它选项的含义如下:
示例:显示/隐藏网格(使用默认皮肤时,按F7和ctrl-F7可显示/隐藏网格):
最初的YSokoban皮肤是一个简单的BMP文件。这样做是为了使皮肤尽可能简单,并且最好只使用一个文件,将皮肤的各个部分组合在一起,以免用户的文件夹中具有太多文件(如果单元格使用不同的图像和/或如果除BMP文件以外还具有一些特殊的文本文件)。
在此文件中,“cell”和“tile”的意思相同。
YSokoban需要以下元素:
在YSokoban中,可以选择箱子或小人,然后单击某个单元格,小人会将箱子推动到那个位置(或直接到达该位置)。因此,YSokoban需要某种方法来标记选定对象。最好的方法是制作动画。关卡完成后,就可以将相同的动画用于所有对象。
所有墙体(当时)用16个单元格表示。因此,它们在图像中占用4x4个单元格。
在制作动画时,YSokoban的每个对象(小人、目标位置的小人、箱子、目标位置的箱子)使用一行。这需要4行以上。前两行由空白单元格、小人和箱子使用,下一行为目标、目标位置的小人、目标位置的箱子。两个未使用的单元格表示选择无效的箱子。
(我认为YSokoban仍然支持此皮肤,但它无法扩展,即无法重新调整大小)。
后来我意识到自己需要某些功能,但此皮肤并不支持。 如下面这些:
######## #-.--$-# #-####-# #-####-# #-####-# #----@-# ########
结果是这样: 新(右)旧(左)皮肤对比
新的皮肤格式就是为了这个需要而设计的,但新的格式已经不可以显示全部可能的墙壁 (或者应该说,如果可能画出来不太好)。 相反, 我们只需要画墙壁的一个部分,在需要的时候再合并它们。
新格式的皮肤和旧皮肤都具有相同数量的单元格, 但墙壁例外(已重做安排),另外还加入了一个关卡外面的单元格。
更准确的说明:
动画是从左到右显示。
墙壁是怎样合并的: 每个墙壁的单元格都分成4个部分 (请看上面的皮肤例子,每个合并部分都有显示)。 当程序需要显示墙壁的时候,它就用从皮肤里面那5个墙壁单元格选择适当的部分合并出来。 通常,这四个部分都是相同大小,但有时候不是 (因为有时候墙壁转移到了左上部分,以给右下部分空间显示墙壁的影子)。 所以我们需要一种方法来告诉程序应该如何分割墙壁 -- 左右分割多少。 因为这个原因,我们利用了第四行第四个单元格。 如果整个单元格都是相同颜色,程序默认将墙壁单元格平分分割。 如果有条不同颜色的线从左上角开始到右,它的长度就是 X。 如果有条不同颜色的线从左上角开始到下,它的长度就是 Y。 X就是每个墙壁分割成4个部分的左上角那块的宽。 Y就是每个墙壁分割成4个部分的左上角那块的高。
这个单元格的其它部分就是用来标记皮肤那些单元格可以有网格显示。 想知道更多资料,请看下面 “关于第四行第四格单元格的详细信息”。
第四行第三格的单元格根本不会用到。作者通常在这里写上他们的名字。
上面用旧皮肤显示的关卡,现在用新皮肤更好看。(因为你可以看到墙壁是用那些部分组成的)
这个单元格开始应该只有一种颜色,什么颜色都可以。 可以在这个单元格中加入其它颜色,以实现以下两个目的:
画一个像素的线,用不同于这个单元格的颜色来画,从左上到右水平划线。 再画另外一条一个像素的线,颜色和之前画的线相同,从左上到下垂直划线。
这两条线合并起来就告诉程序怎么分割那5个墙壁单元格。(就是分割线)
歪推的皮肤这样分割是因为有时候希望将墙壁画不同大小以正确显示影子。
默认情况下(就是说没有分割线,单元格就一种颜色),YSokoban会将墙壁单元格平分成4个完全相同的部分。
请将这两个图片文件做比较: "skinExample1.png" 和"skinExample1_without_net_mark.png" (从歪推网站的皮肤网页下载 skins_description.zip)。 具体来说,就是比较第四行最右面的那格。
除了一个皮肤显示网格,另外一个不显示以外,这两个皮肤完全相同。
显示网格的地方,在这个格中是一个4X8像素的长方形区域。注意,这个4X8的区域不是用来分割墙壁的那两条线。
如果这个格的左上方的坐标为(1,1),这个4X8的区域则从坐标(2,2)开始。在这个4X8的区域里面, 每一个像素都代表皮肤里面的一个格。(注意皮肤是4X8个格)
这个4X8区域和分割墙壁的那两条线的颜色相同。而且,这个颜色也是网格的颜色。
skinExample1.png指示每个格都有网格,网格的颜色是比地板更浅的灰色。
skinExample1_without_net_mark.png指示这个皮肤没有网格。也就是说,如果按CTRL+N将不会显示网格。
此外,不需要全部格都显示网格,可以选择性的给某些格显示,某些格不显示。
在皮肤文件sf_100z_greenRed_gray.png中, 它表示了第三行和第四行的格没有网格。 用歪推打开这个皮肤可以看到结果。
某些皮肤有很好的理由不需要显示网格。有时候,皮肤的每个格已经设计有网格,而不需要再加,或者加了网格会破坏皮肤的美观。 如sf_100rg24.png这个皮肤文件,它本身画的格就已经有网格,不需要再加了。
歪推版本1.85之前,关卡外面不会显示网格。 从版本1.85开始,如果在网格定义中设置了适当的像素,歪推会在关卡外面显示网格。 这个就是上面提过的4X8像素区域,在这个像素区域里面的第三行第四个像素。 这个就是关卡外面的格是否画网格。
现在的皮肤(和以前已经做好的皮肤)基本上全部都支持显示网格。 为了可以兼容以前的皮肤,歪推可以让你在皮肤里面选择是否显示关卡外面的网格。
这个选择符号是一个RGB (红,绿,蓝)三个像素的特别符号,分布在三个角(如图所示)。 这样关卡外面的那些格也是可以显示网格。网格的颜色也是用相同的颜色画的。
这样关卡外面的空地板也会显示网格。 画网的颜色就用4X8像素区域的颜色。
和上面相同, 不同的是另外墙会用另外一个墙壁格显示。 “另外一个墙壁格”指的就是皮肤第4行第三格的单元格。
和第一个相同, 不同的是全部内墙都是用另外一个墙壁格显示。
和上面相同, 不同的是内墙会用在墙壁里面四个墙角接头的地方。
皮肤第4行第三格的单元格以前是不用的。 这个格在这里用作另外一个墙壁格。只是在上面说的特别情况下才用到。
歪推先读这个格的相对坐标(0,0)的像素, 就是这个格的左上角那个像素。 然后读水平线和垂直线。直到遇到不同颜色的像素(在这个格里面),这个就是X和Y的长。这个就是用来分割墙壁的那些单元格。 如果X=Y=格的大小 (如这两条分割线没有画),歪推就将分割线定在中间。 然后就开始读那个4X8的像素区域,这样就知道哪些格需要画网格和用什么颜色画。
就是说,如果你在这个4X8的像素区域什么也不做,就是空的相同颜色,它就会在中间分割墙壁,并且皮肤的全部单元格都是会有网格。 其它的单元格是不用的。 就是说,整个格,只用最上面的一行,最左边的一栏,4X8的区域 -- 从 (1,1)到(4,8)。其它的不用也不管。你画什么也是可以。 但也有例外。例外就是,除了那个特别的RGB三个像素选择关卡外面是否显示网格。
新增加的RGB特别符号是这样用的:在三个角测试是否有红绿蓝颜色。 (X 就是这个格的大小)
如果是这样:(像素是红色,如果 R > G+B), 背景用的颜色是从坐标(X-2, X-2)那里得到。 所有网格的颜色都是和这个背景颜色做比较。 如果4X8像素区域里面的像素颜色和背景颜色不相同,那么网格颜色就用4X8像素区域里面的像素颜色。
感谢Ming提供建议和改进。