我正在尝试制作批量roguelike,但我遇到了三个主要问题。首先,我的消息系统无法正常工作。其次是一个小故障,如果我试图移动到我无法选择的地方继续写下W,S,A和D的底部。第三,也是最重要的是屏幕闪烁非常烦人。我尽量减少加载所需的时间,但无济于事。这是我的代码:
@echo off
setlocal enableextensions
mode con: cols=54 lines=30
set num=1
set nextVar=1
set oldVar=103
set message=a
cls
echo Loading...
:startup
if not %num%==1001 (
set b%num%=.
set /a num = %num% + 1
goto startup
)
cls
set b103=@
goto update
:update
choice /c wsad /n /m ""
if %errorlevel%==1 set /a nextVar = %oldVar% - 50
if %errorlevel%==2 set /a nextVar = %oldVar% + 50
if %errorlevel%==3 set /a nextVar = %oldVar% - 1
if %errorlevel%==4 set /a nextVar = %oldVar% + 1
if defined b%nextVar% (
set b%nextVar%=@
set b%oldVar%=.
set oldVar=%nextVar%
set message="a"
goto display
)
set message="You can not move there."
goto update
:display
set ln1=%b1%%b2%%b3%...
set ln2=%b51%%b52%%b53%...
set ln3=%b101%%b102%...
...
...
...
set ln8=%b351%%b352%...
set ln18=%b851%%b852%%b853%
set ln19=%b901%%b902%%b903%%b904%...
set ln20=%b951%%b952%%b953%%b954%%b955%%b956%...%b1000%
cls
if not "%message%"=="a" (
echo %message%
goto next
)
echo.
:next
echo.
echo %ln1%
echo %ln2%
echo %ln3%
echo %ln4%
echo %ln5%
echo %ln6%
echo %ln7%
echo %ln8%
echo %ln9%
echo %ln10%
echo %ln11%
echo %ln12%
echo %ln13%
echo %ln14%
echo %ln15%
echo %ln16%
echo %ln17%
echo %ln18%
echo %ln19%
echo %ln20%
echo.
goto update
我必须......一些节省空间的部分。如果有人能够特别解决这些问题,那么屏幕闪烁会非常有用。此外,如果有人有关于一代NetHack的想法,就像地牢一样,也会受到赞赏。谢谢。
答案 0 :(得分:1)
首先,我的消息系统无法正常工作。其次是一个小故障,如果我试图移动到我无法选择的地方继续写下W,S,A和D的底部。
更改更新部分的错误goto
语句。您想要转到显示部分,以便重新绘制屏幕(删除旧的使用选择提示),并显示错误消息。
set message="You can not move there."
goto display
第三,也是最重要的是屏幕闪烁非常烦人。
闪烁主要是由于一个命令引起的。 cls
命令。它不是仅重新绘制屏幕,而是首先导致屏幕在绘制新输出之前变黑,导致闪烁。
第1步:删除cls
命令。这意味着您每次必须输出30行来填充屏幕。
更多地减少闪烁将需要对脚本进行更大的改动。而不是回显每一行使用命令窗口的自然能力来包裹线以绘制整个屏幕。这将减少对一对的回声调用量。您的画布设置为54 x 30,因此一次填充整个屏幕等于1620个字符。
步骤2:尽可能通过一次或几次调用输出整个屏幕,以防止绘图/滚动延迟,并使用控制台窗口的自然换行功能。
这是我举一个例子来说明第二步。如果您有任何问题,请告诉我。
@echo off
( if "%~1"=="" start "" /HIGH %0 1 & exit /b 1 )
setlocal enabledelayedexpansion
mode con: cols=80 lines=25
set "mark=0"
set "switch=0"
:next
if %mark% geq 920 set "mark=0" & if %switch% equ 0 ( set "switch=1" ) else set "switch=0"
set top=........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
set bot=........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
if %switch% equ 0 set top=!top:~0,%mark%!^|!top:~%mark%!
if %switch% equ 1 set bot=!bot:~0,%mark%!^|!bot:~%mark%!
goto display
:display
echo %mark%
set /p "=%top:~0,920%" <nul
set /p "=%bot:~0,920%" <nul
ping 192.0.2.2 -n 1 -w 200 >nul
set /a mark+=1
goto next
第3步:另一个有助于提高流程优先级的步骤。我还在第二行上面的示例脚本中添加了这个。