java 同时使用 WASD 和箭头键
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14824786/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using WASD and arrow keys simultaneously
提问by Brannon
I am developing a two player game in Processing (running on Java). One user will control his character using the WASD keys and the other will control movement using the arrow keys. The problem I am having is that using keyPressed
negates WASD when arrows are pressed and vice versa. I have been messing around with it for a really long time. Does anyone know a work around or notice something that I am doing wrong?
我正在处理中开发一个两人游戏(在 Java 上运行)。一个用户将使用 WASD 键控制他的角色,另一个用户将使用箭头键控制移动。我遇到的问题是,keyPressed
按下箭头时使用否定 WASD,反之亦然。我一直在搞乱它很长一段时间。有没有人知道解决方法或注意到我做错了什么?
//global variables
int wide = 600; //canvas width
int tall = 600; //canvas height
int s = 50; //player size
float speed = 2.5; //player movement speed
//colors
int redColor = #CB4646; //player 1 color
int blueColor = #4652CB; //player 2 color
int backgroundColor = #DBE3B3; //background color
float player1X = 600/3-s; //HOW COME width/3 DOESN'T WORK??????????
float player2X = 600*2/3;
float playerY = 600/2-(s/2);
//players
Player player1 = new Player(player1X, playerY, s, speed, "wasd", redColor); //player 1
Player player2 = new Player(player2X, playerY, s, speed, "arrows", blueColor); //player 2
//setup
void setup(){
background(backgroundColor);
size(wide, tall);
smooth();
println(player2.controls);
}
//draw
void draw(){
background(backgroundColor);
player1.usePlayer();
player2.usePlayer();
}
class Player{
//class variables
float x; // x position
float y; // y position
int s; //size
float speed; //speed
String controls; //controls
int colors; //player color
char keyControls [] = new char [4];
//construct
Player(float tempX, float tempY, int tempS , float tempSpeed, String tempControls, int tempColors){
x = tempX;
y = tempY;
s = tempS;
speed = tempSpeed;
controls = tempControls;
colors = tempColors;
}
void usePlayer(){
// draw player
fill(colors);
rect(x, y, s, s);
//move player
keyPressed();
//wraparound
boundaries();
}
void keyPressed(){
//sets controls for wasd
if(controls == "wasd"){
if(key == 'w' || key == 'W'){
y -= speed; //move forwards
}
if(key == 's' || key == 'S'){
y += speed; //move backwards
}
if(key == 'd' || key == 'D'){
x += speed; //move right
}
if(key == 'a' || key == 'A'){
x -= speed; //move left
}
}
//sets controls for arrows
if(controls == "arrows"){
if(key == CODED){
if(keyCode == UP){
y -= speed; //move forwards
}
if(keyCode == DOWN){
y += speed; //move backwards
}
if(keyCode == RIGHT){
x += speed; //move right
}
if(keyCode == LEFT){
x -= speed; //move left
}
}
}
}
//pacman style wraparound
void boundaries(){
if(x == width) x = 2;
if(y == height) y = 2;
if(x == 0) x = width-s;
if(y == 0) y = height-s;
}
}
采纳答案by Mike 'Pomax' Kamermans
Track your keys independently, don't rely on the event globals.
独立跟踪您的密钥,不要依赖事件全局变量。
boolean[] keys = new int[255];
void keyPressed() {
keys[keyCode] = true;
}
void keyReleased() {
keys[keyCode] = false;
}
void draw() {
updatePlayers();
drawStuff();
}
void updatePlayers() {
if(keys[LEFT]) { p1.move(-1,0); }
if(keys[RIGHT]) { p1.move(1,0); }
if(keys[UP]) { p1.move(0,-1); }
if(keys[DOWN]) { p1.move(0,1); }
if(keys['a']) { p2.move(-1,0); }
if(keys['d']) { p2.move(1,0); }
if(keys['w']) { p2.move(0,-1); }
if(keys['s']) { p2.move(0,1); }
}
Note this has to be a series of if statements, because you want to handle all pressed keys. If someone's holding left and right, p1 will move left, and right.
请注意,这必须是一系列 if 语句,因为您要处理所有按下的键。如果有人左手拿着右手,p1 会左右移动。
Also note that this example code doesn't filter for the higher-than-255 codes you get for special keys, so you probably want to put an "if(keyCode>255) return" at the start of the event handlers.
另请注意,此示例代码不会过滤您为特殊键获得的高于 255 的代码,因此您可能希望在事件处理程序的开头放置“if(keyCode>255) return”。
回答by Arthur Longbottom
Here is my Arduino/Processing code that I used to handle simultaneous key presses (to move diagonally). It fixes the issue with boolean[] cannot be cast to int[]
error as shown by @Brannon and uses keyCodes instead of key.
这是我用来处理同时按下的按键(对角移动)的 Arduino/处理代码。它修复了boolean[] cannot be cast to int[]
@Brannon 所示的错误问题,并使用 keyCodes 而不是 key。
import processing.serial.*;
?
boolean[] keys = new boolean[255];
Serial port;
?
void setup() {
port = new Serial(this, Serial.list()[1], 9600);
?
}
?
void draw() {
// loop through boolean array and see which ones (index = keyCode)
// are true, then write to them.
for(int i = 0; i < 255; i++) {
if(keys[i]) {
if (i == 87) { port.write('w'); }
if (i == 65) { port.write('a'); }
if (i == 83) { port.write('s'); }
if (i == 68) { port.write('d'); }
}
}
}
?
void keyPressed() {
keys[keyCode] = true;
}
?
void keyReleased() {
keys[keyCode] = false;
}
回答by Patashu
Is key
a global variable? I don't see it getting passed to the Player. If it's global, then it can only hold one key at a time, which precludes controlling two players at once.
是key
全局变量吗?我没有看到它传递给 Player。如果它是全局的,那么它一次只能按住一个键,这就排除了一次控制两个玩家的可能性。