Processing keyTyped()在处理GUI中工作,但在浏览器中不工作
我在做的程序有问题。当我使用Processing GUI运行它时,它可以正常工作,但由于某些原因,当我使用Processing.js将它添加到网页时,它将无法工作。我的问题是永远不会调用keyTyped。我试过摆弄它,但唯一有效的方法是将它添加到绘图中:Processing keyTyped()在处理GUI中工作,但在浏览器中不工作,processing,Processing,我在做的程序有问题。当我使用Processing GUI运行它时,它可以正常工作,但由于某些原因,当我使用Processing.js将它添加到网页时,它将无法工作。我的问题是永远不会调用keyTyped。我试过摆弄它,但唯一有效的方法是将它添加到绘图中: if(keyPressed) { <code to add key to string> } 然而,这几乎不起作用,更不用说效果了。一定有更好的办法。这是我的整个计划: String[] chat = new String[0
if(keyPressed) {
<code to add key to string>
}
然而,这几乎不起作用,更不用说效果了。一定有更好的办法。这是我的整个计划:
String[] chat = new String[0];
boolean loggedIn = false;
String username = "";
String query = "";
int t = 0;
String timeStamp() {
String hr, mn, se;
if (hour() < 10) {
hr = "0" + hour();
} else {
hr = hour() + "";
}
if (minute() < 10) {
mn = "0" + minute();
} else {
mn = minute() + "";
}
if (second() < 10) {
se = "0" + second();
} else {
se = second() + "";
}
return "[" + hr + ":" + mn + ":" + se + " ";
}
void addLocalMessage(String msg, String file) {
if (!file.equals("")) {
String[] file_temp = append(loadStrings(file), timeStamp() + msg);
saveStrings(file, file_temp);
} else {
String[] chat_temp = append(chat, timeStamp() + msg);
chat = chat_temp;
}
}
void addGlobalMessage(String msg) {
String[] users = loadStrings("users.txt");
for (int i = 0; i < users.length; i++) {
addLocalMessage(msg, users[i].split(" ")[0] + ".txt");
}
}
void attempt(String q) {
if (!q.substring(0, min(1, q.length())).equals(".")) {
if (loggedIn) {
if (q.length() > 0) {
addGlobalMessage("CHAT] " + username + ": " + q);
} else {
addLocalMessage("ERROR] Message length must be greater than 0.", username + ".txt");
}
} else {
addLocalMessage("ERROR] Access denied.", "");
}
} else if (q.substring(0, min(6, q.length())).equals(".login")) {
if (!loggedIn) {
String[] users = loadStrings("users.txt");
String[][] UPCombos = new String[users.length][2];
for (int i = 0; i < users.length; i++) {
UPCombos[i][0] = split(users[i], " ")[0];
UPCombos[i][1] = split(users[i], " ")[1];
}
String[] withArgs = q.split(" ");
if (withArgs.length == 3) {
for (int i = 0; i < users.length; i++) {
if (UPCombos[i][0].equals(withArgs[1]) && UPCombos[i][1].equals(withArgs[2])) {
loggedIn = true;
username = withArgs[1];
addLocalMessage("SERVER] Logged in successfully as " + username, username + ".txt");
}
}
if (!loggedIn) {
addLocalMessage("ERROR] Password is invalid.", "");
}
} else {
addLocalMessage("ERROR] Arguments count is incorrect. Please enter as: .login <username> <password>.", "");
}
} else {
addLocalMessage("ERROR] You are already logged in.", username + ".txt");
}
} else {
addLocalMessage("ERROR] Not supported", "");
}
}
void setup() {
size(1200, 600);
chat = new String[0];
frameRate(10);
addLocalMessage("SERVER] Running MSG123 v0.0.9", "");
addLocalMessage("ERROR] You are not logged in. Please log in with .login <username> <password>.", "");
}
void draw() {
if(keyPressed) {
addLocalMessage("You typed something", "");
if(key == ENTER) {
attempt(query);
query = "";
} else if(key == BACKSPACE) {
query = query.substring(0, max(0, query.length() - 1));
} else {
query += key;
}
}
background(127, 127, 255);
textSize(10);
fill(0, 0, 0);
if (loggedIn) {
chat = loadStrings(username + ".txt");
}
if (chat.length < 40) {
for (int i = 0; i < chat.length; i++) {
text(chat[i], 5, i*15 + 15);
}
} else {
int pos = 0;
for (int i = chat.length - 39; i < chat.length; i++) {
text(chat[i], 5, pos*15 + 15);
pos++;
}
}
text(query, 5, 595);
}
void keyTyped() {
if(key == ENTER) {
attempt(query);
query = "";
} else if(key == BACKSPACE) {
query = query.substring(0, max(0, query.length() - 1));
} else {
query = query + key;
}
}
我希望有人能帮助我。我没有为处理JS编写太多的代码,所以我真的不知道我在做什么:P magic
如果你想做密钥处理,你需要非常小心。在这种情况下,对于enter检查,您可能需要执行以下操作:
if (int(key) == 13) {
...
}
对于退格键或您正在测试的任何其他键,使用类似的方法。有一些技术限制阻止JS和Java做完全相同的事情,上面的链接将解释所有这些限制
此外,由于JavaScript的工作方式,Pjs不能使用相同的名称来执行变量和函数,请参见。对于按键Pjs,Pjs提供了事件处理函数,但没有相同的命名布尔值
解决此问题的一个简单方法是使用您自己的:
boolean flipScreen = false;
void setup() {
size(500,500);
// no need to waste cpu cycles:
noLoop();
}
void draw() {
background(flipScreen? 255 : 0);
// gets retriggered based on user events
}
void keyPressed() {
flipScreen= true;
redraw();
}
void keyReleased() {
flipScreen= false;
redraw();
}
这还有一个好处,就是根据实际使用的变量来命名变量,这在编程中几乎是通用的惯例。您是否测试过按键或按键释放?“keyTyped”一开始甚至没有被调用。我使用几个我知道在该方法中工作的函数来测试它。这让我发疯了…如果你在里面放了一个println或什么东西,你应该看到它在打印;它存在并且在技术上运行良好,但特别是对于您遇到的按键操作-我添加了更多的代码来演示如何在这种情况下绕过它。keyTyped只是没有被调用。我试着在里面放一个PrintLString,但它没有出现在控制台上。这很奇怪-一个快速的jsbin显示它在-哪个版本的Pjs被用于你的草图上-我不知道我在使用哪个版本,但我知道我可以去下载最新的版本,看看是否有帮助。。。