在我使用Batch编程的游戏中,使用特定函数来绘制具有预设tileset的地图。它相当复杂,绘制整个全彩色地图需要花费几秒钟的时间。
我想为玩家添加一个图标。我想完全在图形子程序中实现它,而不是改变地图数据。
现在,图标显示,但它将整个图形线推回一个空间。我想让它跳过播放器位于其上的磁贴,但是这样做的唯一方法似乎是在BASIC中执行类似于你的NEXT命令。我不知道批次相当于此,所以我来这里寻求帮助。在绘制播放器磁贴后,我需要跳过FOR循环的特定迭代。
没有相当多的上下文,这没有多大意义,但这里是子程序:
:D
REM Draw tiles
IF /I %OSV% LSS 3 (
FOR /L %%G IN (0,1,31) DO (
REM Old tileset
IF "%2" == "1" IF "%%G" == "%X%" CALL :C 0C "i" & REM skip the rest
IF "!M%MAP%%1:~%%G,1!" == "0" CALL :C 00 " "
IF "!M%MAP%%1:~%%G,1!" == "1" CALL :C 2A "w"
IF "!M%MAP%%1:~%%G,1!" == "2" CALL :C 87 "S"
IF "!M%MAP%%1:~%%G,1!" == "3" CALL :C 6E "W"
IF "!M%MAP%%1:~%%G,1!" == "4" CALL :C 0A "T"
IF "!M%MAP%%1:~%%G,1!" == "5" CALL :C 0A "n"
IF "!M%MAP%%1:~%%G,1!" == "6" CALL :C 6E "H"
IF "!M%MAP%%1:~%%G,1!" == "7" CALL :C 91 "m"
IF "!M%MAP%%1:~%%G,1!" == "8" CALL :C 19 "m"
IF "!M%MAP%%1:~%%G,1!" == "9" CALL :C B3 "M"
IF "!M%MAP%%1:~%%G,1!" == "A" CALL :C 4C "m"
IF "!M%MAP%%1:~%%G,1!" == "B" CALL :C C4 "M"
IF "!M%MAP%%1:~%%G,1!" == "C" CALL :C 6E "O"
IF "!M%MAP%%1:~%%G,1!" == "D" CALL :C 6E "W"
IF "!M%MAP%%1:~%%G,1!" == "E" CALL :C 78 "W"
IF "!M%MAP%%1:~%%G,1!" == "F" CALL :C 0D "X"
IF "!M%MAP%%1:~%%G,1!" == "G" CALL :C 6E "E"
IF "!M%MAP%%1:~%%G,1!" == "H" CALL :C 48 "E"
IF "!M%MAP%%1:~%%G,1!" == "I" CALL :C 68 "n"
IF "!M%MAP%%1:~%%G,1!" == "J" CALL :C 6E "m"
IF "!M%MAP%%1:~%%G,1!" == "K" CALL :C E6 "W"
IF "!M%MAP%%1:~%%G,1!" == "L" CALL :C 6A "T"
IF "!M%MAP%%1:~%%G,1!" == "M" CALL :C 2A "w"
IF "!M%MAP%%1:~%%G,1!" == "N" CALL :C 87 "S"
IF "!M%MAP%%1:~%%G,1!" == "O" CALL :C 0D "i"
IF "!M%MAP%%1:~%%G,1!" == "P" CALL :C 6A "Y"
IF "!M%MAP%%1:~%%G,1!" == "Q" CALL :C BF "C"
)
)
GOTO :EOF
请注意我删除了高级(“Fancy”)tileset,因为它增加了更多的复杂性并且在这里没有正确显示。
在绘制角色(第六行)之后,我需要跳过序列的其余部分以防止它绘制玩家站在顶部的图块。
传递给函数的变量是:
除了终端之外,没有输出通过C功能,它只是绘制一个彩色字符。
任何想法都会很棒。
编辑:这是一些没有播放器图标的示例输出。红色数字表示玩家的位置。我想用玩家的图标替换此位置的牌。
Overworld截图
沙漠截图
你没有创建一个MCVE,你的代码没有意义,因为如果它在第6行之后停止,那么剩下的就没用了,并且不需要循环32次。因此,这只是一个例子
要在条件为真时阻止块运行,只需反转条件
FOR /L %%G IN (0,1,31) DO (
rem Things that will done every time
IF NOT "%%G" == "6" (do something) else (
rem Things that will be done when %%G != 6
rem i.e. if %%G != 6 next
)
)
在这种情况下,如果要在第一行的条件为真时跳过剩余的命令,则
FOR /L %%G IN (0,1,31) DO (
IF "%2" == "1" IF "%%G" == "%X%" (CALL :C 0C "i") ELSE (
IF "!M%MAP%%1:~%%G,1!" == "0" CALL :C 00 " "
IF "!M%MAP%%1:~%%G,1!" == "1" CALL :C 2A "w"
IF "!M%MAP%%1:~%%G,1!" == "2" CALL :C 87 "S"
IF ...
)
)
再次,for循环不是必需的,因为每个循环只跳转到一个case。第一行看起来正在检查是否是播放器,所以只需将其拆分为单独的函数即可
IF /I %OSV% LSS 3 (
IF "!M%MAP%%1:~0,1!" == "0" (call :checkplayer %2 %%G %X% || CALL :C 00 " ")
IF "!M%MAP%%1:~1,1!" == "1" (call :checkplayer %2 %%G %X% || CALL :C 2A "w")
IF "!M%MAP%%1:~2,1!" == "2" (call :checkplayer %2 %%G %X% || CALL :C 87 "S")
...
)
:checkplayer
IF "%1" == "1" IF "%2" == "%3" (
CALL :C 0C "i"
exit /b 0
) ELSE (
exit /b 1
)