我正在自学,从在线教程,如何用Java编写游戏。我正在使用Java Applets创建一个Pong游戏。每个桨叶由不同的钥匙控制,以进行1v1比赛。如果两个用户在不同时间点击密钥,这可以正常工作。但是当按下一个键然后按住另一个键时(例如:按住箭头键,然后用户2按住'S'键),第二个键将覆盖第一个键,第一个键盘将停止移动。我猜我需要使用线程,但我不太了解它们,我无法理解如何使用/实现它们。当两个(或更多)键被按下时,我将如何处理这个案件呢?
奖金:就像我说我对线程知之甚少 - 我假设我还需要一个球/冰球移动而其他一切都在继续。是正确的,如果是的话,我怎么把线程放在没有输入的东西上?
谢谢你的帮助, DJ
答案 0 :(得分:3)
游戏通常使用称为游戏循环(google it)的东西而不是线程。
http://en.wikipedia.org/wiki/Game_programming
基本理念是
Loop
Get all inputs
Get game clock
Update state based on clock and inputs
Update Display
Limit frame rate if you need to
无论如何 - 而不是获取键盘事件 - 你在某些点检查键盘的状态。这段代码似乎是为Java做的
http://www.gamedev.net/reference/articles/article2439.asp
它使用事件来设置你在循环中看到的变量。
答案 1 :(得分:3)
您通常要记住每次按键的状态。
您保留一系列动作(如果您需要,还可以保留所有按键的数组)。 keyDown事件导致例如
boolean actions[12];...
...
public boolean keyDown( Event e, int key ) {
if (key == 'a') {
actions[ACTION_LEFT] = true;
}
..
}
你需要捕获keyup事件,并在释放密钥时将操作设置为false。
在移动逻辑中,您只需检查按键的状态
即可if(actions[ACTION_LEFT] == true)
moveLeft();
if(actions[ACTION_RIGTH] == true)
moveRight();
答案 2 :(得分:1)
以防万一有人想看看我是怎么回答这个问题的。我的keyDown()和keyUp()方法如下:
public boolean keyDown(Event e, int key)
{
message = key + "pressed";
//right paddle
if(key == 1005)
{
rpaddle_up = true;
}
if(key == 1004)
{
rpaddle_down = true;
}
//left paddle
if(key == 115)
{
lpaddle_up= true;
}
if(key == 119)
{
lpaddle_down=true;
}
//x key = exit
if(key == 'x')
System.exit(0);
return true;
}
public boolean keyUp(Event e, int key)
{
//right paddle
if(key == 1005)
{
rpaddle_up = false;
}
if(key == 1004)
{
rpaddle_down = false;
}
//left paddle
if(key == 115)
{
lpaddle_up= false;
}
if(key == 119)
{
lpaddle_down=false;
}
return true;
}
希望如果有人有同样的问题,这将有助于他们。并感谢大家的投入和帮助。
答案 3 :(得分:0)
如果我没弄错的话,你可以使用Applet获得keyUp()和keyDown()方法。您是否尝试在keyDown上设置标志,然后在keyUp上取消设置?例如:
public boolean keyDown( Event e, int key )
{
if (key == 'a') {
player1.go("left")
}
}
public boolean keyUp( Event e, int key )
{
if (key == 'a') {
player1.stop("left")
}
}
只是一个想法。我确信有一种标准的方法可以解决这个问题。
答案 4 :(得分:0)
您可以使用Swing Timer定期在keydown / keyup事件之间触发移动事件。