未检测到处理按键 BACKSPACE

Processing Keypress BACKSPACE gets not detected

我正在使用 Processing 创建游戏并想输入用户名。我知道它并不完美(第一次处理),我可以写每个字母但是 backspace 不起作用。
这是我的代码:

void keyTyped() {
  if(status("getUsername")) {
    if(((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z') || (key >= '0' && key <= '9') || key == ' ') && (key != CODED && keyCode != ENTER)) {
      user.addLetter(key);
    } else if(key == CODED && keyCode == BACKSPACE) {
      user.remLetter();
    }
    System.out.println(user.getName());
  }
}

用户

class User {
  String name = "";

  void addLetter(char letter) {
    this.name = this.name + letter;
  }

  void remLetter() {
    if(name.length() != 0) {
      System.out.println("rem");
      name = name.substring(0, name.length()-2);
    }
  }
}

输入

Jon[BACKSPACE]

输出

J
Jo
Jon

有谁知道我该如何解决这个问题?或者我如何改进我的代码?


我尝试使用 George Profenza 中的演示代码并且它运行良好,但是当我尝试在我的代码中使用它时,它由于未知原因而不起作用......


完整代码:https://github.com/BeeTheKay/GameSnake.git

您可能错过了一个使用 key 的小陷阱:

For non-ASCII keys, use the keyCode variable. The keys included in the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and DELETE) do not require checking to see if the key is coded, and you should simply use the key variable instead of keyCode If you're making cross-platform projects, note that the ENTER key is commonly used on PCs and Unix and the RETURN key is used instead on Macintosh.

只需更改:

} else if(key == CODED && keyCode == BACKSPACE) {

} else if(key == BACKSPACE) {

此外,您可能想要删除一个字符而不是两个:

name = name.substring(0, name.length()-2);

只需将其更改为:

name = name.substring(0, name.length() - 1);

这是主要基于您的代码的基本演示草图:

User user = new User();

void setup(){}

void draw(){
  background(0);
  text(user.name,5,15);
}

boolean status(String s){
  return true;
}

void keyTyped() {
  println(key == CODED, key, BACKSPACE, key == BACKSPACE);
  if(status("getUsername")) {
    if(((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z') || (key >= '0' && key <= '9') || key == ' ') && (key != CODED && keyCode != ENTER)) {
      user.addLetter(key);
    } else if(key == BACKSPACE) {
      user.remLetter();
    }
    System.out.println(user.getName());
  }
}

class User {
  String name = "";

  void addLetter(char letter) {
    this.name = this.name + letter;
  }

  void remLetter() {
    if(name.length() > 0) {
      System.out.println("rem");
      name = name.substring(0, name.length() - 1);
    }
  }
  
  String getName(){
    return name;
  }
}

(以后,通过发布编译的代码片段,尽量让其他人更容易支持你)

更新 我试过上面发布的 github 回购协议,keyTyped() 和基于 OpenGL 的渲染器(P2D, P3D):

  • P2DP3D 编码键似乎不会触发 keyTyped(),但是 keyPressed()keyReleased() 会触发
  • 使用其他渲染:JAVA2DFX2D 按预期工作。

这似乎是一个 known Processing issue,但遗憾的是它看起来不会在不久的将来得到修复。

就我个人而言,这是我玩了这么多年 Processing 之后第一次听说 keyTyped() :) 我已经习惯了 keyPressed() / keyReleased().

同时你至少有两个选择:

  1. 如果您真的想使用 keyTyped(),请使用 size(600, 600, JAVA2D); 而不是 size(600, 600, P2D);(希望 performance/rendering 仍然足够好)
  2. 使用P2D,但只需将您当前在keyTyped()中的逻辑移动到keyReleased()