2015-07-11 47 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應用程序對於您的機器人用戶界面來說是一個更好的解決方案 - 當然這是一種更優雅的方法。 –