我要创建的批处理游戏的框架存在问题。我想检查变量是否是空格以外的东西。但是,我要检查的变量本身是由两个变量定义的。例如:
if not %px%xplayerlocation%y%yplayerlocation%%==%blank% goto wherever
如您所见,要检查的变量由%xplayerlocation%和%yplayerlocation%的值确定。据我所知,只有最外面的%%符号被读为变量,而最里面的%%符号被读为文字百分号。有谁知道解决这个问题的方法吗?如果有人需要,我会提供任何其他信息。谢谢。
您已经识别出问题的根源,但是您对行为的描述不正确。解析器将尝试扩展名为px
和的变量y
,并将最终结果%%
转换为%
。
Magoo解决方案可以使用,但是使用CALL的速度很慢。对于许多小脚本来说,这可能不是问题,但对于批处理游戏,它可能会降低性能。
您要延迟扩展。setlocal enableDelayedExpansion
在脚本的开头附近添加。然后使用以下命令:
if not !px%xplayerlocation%y%yplayerlocation%!==%blank% goto wherever
正常%var%
扩展发生在解析时,而!var!
扩展发生在执行时,因此,您可以获得正确的结果。
如果的值为%blank%
空格,则上述方法将无效。最简单的解决方案是也使用延迟扩展!blank!
。
您可能会发现自己处于需要在同一代码块内设置和扩展坐标值的情况,例如在FOR循环或IF语句中:
setlocal enableDelayedExpansion
...
REM This does not work
for ... in (...) do (
...
set /a "xPlayerLocation+=xChange, yPlayerLocation+=yChange"
if not !px%xplayerlocation%y%yplayerlocation%!==!blank! REM doSomething
...
)
上面的方法不起作用,因为%var%
扩展是在解析时发生的,并且在执行任何代码之前先解析了整个带括号的代码块。因此,扩展后的值是恒定的-它将扩展为循环开始之前存在的值。
解决方案是使用延迟扩展将坐标值传输到FOR变量:
setlocal enableDelayedExpansion
...
REM This works
for ... in (...) do (
...
set /a "xPlayerLocation+=xChange, yPlayerLocation+=yChange"
for %%X in (!xPlayerLocation!) do for %%Y in (!yPlayerLocation!) do (
if not !px%%X%y%%Y!==%blank% REM doSomething
)
...
)
或者
setlocal enableDelayedExpansion
...
REM This also works
for ... in (...) do (
...
set /a "xPlayerLocation+=xChange, yPlayerLocation+=yChange"
for /f "tokens=1,2" %%X in ("!xPlayerLocation! !yPlayerLocation!") do (
if not !px%%X%y%%Y!==%blank% REM doSomething
)
...
)
如果您热衷于使用批处理开发高质量的游戏,那么您可能会对研究我在开发SNAKE.BAT(仅使用本地批处理命令的街机风格游戏)中使用的技术感兴趣。文章的开头是一堆代码,但是之后我描述了我用来提高性能的许多技术。它是高级的东西,所以不要试图一次吸收所有东西。吸收您所能提供的知识,然后在获得更多经验后重新访问该帖子。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句