我正在制作一个RPG游戏并获得这个地图系统,您可以在其中选择一个旅行目的地,并且每次移动时移动一个更接近它的地块。
我想知道的是我如何在我的地图上显示玩家所在的地方。
更具体地说,我有两个变量; posX
和posY
。并希望用代表玩家的新角色替换posY
,角色posX
上的角色。
我尝试使用variable:~int,int
编辑一行,但这些行的长度不同,因此不起作用。
编辑:这是我在下面一直在处理的代码,我认为IF !vertical!==!downY!
永远不会是真的,pause
调用是用于测试的。
:DisplayPlayerPos
set /a vertical=27
set /a horizontal=69
set /a downY=%vertical%-%posY%
FOR /F "tokens=*" %%L IN (SaveGames\Default\World\Color\WorldMap.txt) DO (
set /a vertical=!vertical!-1
IF !vertical!==!downY! (
set left=%%L:~-!%horizontal%-%posX%!
echo !left!
set right=%%L:~!posX! + 1
echo !right!
set newLine=!%left%X%right%!
echo. !newLine!
pause
Exit /b
)
)
pause
Exit /b
Map.txt:
echo.+---------------------------------------------------------------------+ =========// Travel Map //=========
echo.| 8obo.8:.,-!!::;.::P"-8:,.-P':_,./=,.oodoo-** | World: !worldName!
echo.|-+-----+;-+.+++++-+./-::\8-;-8P::P8bP/' | Region: Far West
echo.|,8-+---++++-++++++//`=/---_,`:8b8\Y::8.... SENTO |
echo.|++-;-'8:`--;`-+++-=:-' `+.::\_/\--' X | !travelTarget! Position: !travelX!,!travelY!;
echo.|<[/--"--"-::'''+''= GWEN +`+-U' | Your position: !posX!,!posY!;
echo.|,// `'"+=/Y=--'+\ FOREST |:/'| |
echo.|`8b. ' '|8P\L|,`. /|/ :b |
echo.||\'b \\\++'+++-,+'+'---/ |
echo.|XX8' ``:-.--+/-._.+-_,\ |
echo.| "' /'-+-.``-8+-:dop. |
echo.| '-'++--+-: |
echo.| `-\:"\\'-P>_ |
echo.| Y"\=="' ,-. |
echo.| X THORM / `. _.-|
echo.| ,--. / +-. `---''---|
echo.| ,-' `-------' / `-+ -`---'|
echo.| ,-' ,. LOGAN _-' `----. |
echo.| ,' ,-' ; RIVER ,-'' `|
echo.| ,--' ,' ; ,---' |
echo.| ,-' ,' ; / |
echo.| -/ +---' ,' ,' |
echo.| / `-------' ,' |
echo.| ,' ,----------' X |
echo.| ,' +-' BENDANIA |
echo.| / ,' |
echo.| | ,/ |
echo.| ; /; |
echo.+---------------------------------------------------------------------+
这段代码打印地图:
:PrintColorFile
set ColorEx=
if /i "%Colors%"=="True" set ColorEx=C
for /F "tokens=*" %%A in (SaveGames\%saveName%\World\Color\%1%ColorEx%.txt) do %%A
Exit /b
答案 0 :(得分:1)
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q42009080.txt"
:: some random positions
SET posy=7
SET posx=14
:: Add 4 to posx to compensate for "echo." and count-from-0 not 1
SET /a repl=posx+4
SET /a tail=repl+1
SET "me=@"
FOR /f "tokens=1*delims=:" %%a IN ('type "%filename1%" ^|findstr /n "e" ') DO (
IF %%a==%posy% (
SET "line=%%b"
REM just for fun - set `repl` to the character replaced in line
SET "repl=!line:~%repl%,1!"
SET "line=!line:~0,%repl%!%me%!line:~%tail%!"
!line!
) ELSE (%%b)
)
ECHO replaced "%repl%"
GOTO :EOF
您需要更改sourcedir
的设置以适合您的具体情况。
我使用了一个名为q42009080.txt
的文件,其中包含我的测试数据。
地图文件type
进入findstr
,其参数可以找到每一行。使用/n
找到的每一行都会sequencenumber:
作为前缀,因此使用delims=:
解析并使用令牌1
和*
会将行号放在%%a
中%%b
中的行文字。
如果行号与posy
不匹配,则只需执行行文本。如果匹配,则将文本传输到line
,因为您可以对元变量进行子字符串,然后将posx
个字符替换为me
,将所需的三个字符连接起来子串并执行结果。
请注意,此例程使用delayedexpansion
- line
是在需要更改值时使用的唯一值。 %repl%
,%me%
和%tail%
将在其当前值解析for/f
时被替换,因此repl
在块内被更改的事实因为代码使用的是repl
的原始值。
当然,repl
用于接收线路上替换的角色并不重要。可以选择任何正常变量(line
除外) - 我只是展示了原始值&#34;未来读者的概念......