未检测到处理按键 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
):
- 与
P2D
、P3D
编码键似乎不会触发 keyTyped()
,但是 keyPressed()
、keyReleased()
会触发
- 使用其他渲染:
JAVA2D
或 FX2D
按预期工作。
这似乎是一个 known Processing issue,但遗憾的是它看起来不会在不久的将来得到修复。
就我个人而言,这是我玩了这么多年 Processing 之后第一次听说 keyTyped()
:) 我已经习惯了 keyPressed()
/ keyReleased()
.
同时你至少有两个选择:
- 如果您真的想使用
keyTyped()
,请使用 size(600, 600, JAVA2D);
而不是 size(600, 600, P2D);
(希望 performance/rendering 仍然足够好)
- 使用
P2D
,但只需将您当前在keyTyped()
中的逻辑移动到keyReleased()
中
我正在使用 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 ofkeyCode
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
):
- 与
P2D
、P3D
编码键似乎不会触发keyTyped()
,但是keyPressed()
、keyReleased()
会触发 - 使用其他渲染:
JAVA2D
或FX2D
按预期工作。
这似乎是一个 known Processing issue,但遗憾的是它看起来不会在不久的将来得到修复。
就我个人而言,这是我玩了这么多年 Processing 之后第一次听说 keyTyped()
:) 我已经习惯了 keyPressed()
/ keyReleased()
.
同时你至少有两个选择:
- 如果您真的想使用
keyTyped()
,请使用size(600, 600, JAVA2D);
而不是size(600, 600, P2D);
(希望 performance/rendering 仍然足够好) - 使用
P2D
,但只需将您当前在keyTyped()
中的逻辑移动到keyReleased()
中