我正在制作一个简单的 ASCII 动画,我需要能够将光标放置在控制台屏幕中的任意点。
在搜索时,我发现这个博客表明可以通过以下方式实现:
(print (str (char 27) "[2J")) ; clear screen
(print (str (char 27) "[;H")) ; move cursor to the top left corner of the screen
,它使用 ANSI 转义序列。
第一行按预期工作,但不幸的是,我找不到允许第二行移动光标的控制台。
在查看了 ANSI 转义序列是如何工作的之后,我编写了这个函数来简化它的使用:
(defn move-cursor-to [x y]
(print (str (char 27) "[" y ";" x "H")))
但是当我运行时(move-cursor-to 10 10)
,我尝试过的每个“控制台”的输出都是错误的:
IntelliJ/Cursive 的 REPL 完全忽略了它;什么都不打印。
IntelliJ 的终端将转义字符打印为 a ?
,并逐字打印其余的 ( ?[10;10H
)
Window 10 命令提示符打印的内容类似于 IntelliJ 的终端,但?
它打印的是在一个盒子内。
难道我做错了什么?有没有办法让它在标准的 Windows 10 命令提示符下工作?
同时我写了这个来填补空白:
(defn move-cursor-to [x y]
(let [r #(apply str (repeat % %2))]
(print (str (r y \newline)
(r x \space)))))
但这是一个糟糕的解决方案。它需要在使用前清除屏幕,这对于简单动画之外的任何内容都是不可接受的。
有一种更简单的方法可以做到这一点。看看clojure-lanterna库。
该库将允许您在屏幕上寻址任意位置。它可以使用终端模拟器,也可以创建一个基于摆动的窗口。
使用这个库的另一个好处是它还包含对虚拟窗口或虚拟屏幕的支持,这可以使您的输出看起来更流畅并减少潜在的闪烁。
该库还支持 ANSI 颜色代码和其他一些不错的功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句