2015-07-11 57 views
2

我刚刚设法得到了一个N​​ode.js minecraft bot API(名为mineflayer)。当我最后一次制作“我的世界”机器人时(我自己用C++编写),我遇到了一个问题,那就是when writing in the console, the server messages would mix with whatever I'm writing。我当时回答的答案似乎有太复杂/不明确的解决方案,所以我放弃了。防止Node.js控制台中的输入/输出混合?

现在我希望Node.js解决了这个问题,但显然不是。 Node.js中有一个简单的解决方案吗?我想是这样的:

image description

但现在,命令,我写拌上输出(红色写输入,绿色是控制台输出,彩色使用GIMP):

image description

我使用的是readline模块:

var readline = require("readline"); 
var rl = readline.createInterface({ 
    input: process.stdin, 
    output: null, 
}); 

rl.on('line', function(line) { 
    var inp = line.trim(); 
    //Bot internal commands start with ~ 
    if(line[0]=='~') { 
    command(line.substr(1)); 
    } 
    else { 
    //use server chat 
    bot.chat(line); 
    } 
}); 
+0

只是一个想法:我想你可以采取一个完全不同的方法,并制作一个网络应用程序,而不是命令行界面。您可以使用Express来使用Node.js,并提供一个可以输入命令的简单页面。您可以使用HTML元素(如按钮和其他表单控件)来改进您的用户界面。要实时显示输出,可以使用[socket.io](http://stackoverflow.com/a/24232050/778272)。 –

回答

0

我开始用一个简单的功能实例只是为了告诉一个办法做到这一点:

var 
    readline = require("readline"), 
    ansi = require('ansi'); 

var rl = readline.createInterface({ 
    input: process.stdin, 
    output: null 
}); 

ansi.clear(); 
ansi.row(1); 

rl.on('line', function(line) { 

    ansi.row(2); 
    ansi.clearLine(); 
    ansi.print(line); 

    ansi.row(1); 
    ansi.clearLine(); 
}); 

图书馆ansi是一个简单的测试,我做了几个月前操作使用ANSI escape codes终端线。要使用它,只需在同一文件夹上面的代码中运行以下命令:

npm install https://github.com/luciopaiva/ansi.git 

您可以直接前往my library's repository检查我的代码。

该代码非常简单,我建议您复制它并适应您的需求。

ansi.clear()只是清除整个终端,然后ansi.row(1)将光标移动到第一行,您将能够输入命令。在我的简单示例中,代码将仅打印到行#2的用户在返回键之前键入的内容。然后,只需运行上面的代码即可看到它的工作方式,并将其适用于沿着终端的其余行滚动消息的机制。

+0

我想,在这种情况下,我不能再使用'console.log'而没有问题... –

+0

是的,你必须制作自己的自定义日志()来跟踪行位置。 –

+0

请记住,'console.log'不会与任何涉及操纵游标的其他方法一起使用。如果你使用像[祝福](https://github.com/chjj/blessed)或TooTallNate的[ansi](https://github.com/TooTallNate/ansi.js/)这样的库,你必须面对问题。就像我在对您的问题发表评论时所说的,Web应用程序对于您的机器人用户界面来说是一个更好的解决方案 - 当然这是一种更优雅的方法。 –