Java - 循环接收输入
Java - recieving input in loop
我使用 LWJGL 制作 3d 图形。
我想做的是通过按指定键(例如 - F1)将呈现类型从 "GL_TRIANGLES" 更改为 "GL_LINES"。
因为高帧率 normal
if(Keyboard.isKeyDown(key))
{
//Action
}
在正常按下按钮期间最多可以打开和关闭 200 次。
总的来说,这对我来说很有趣,这个问题通常是如何解决的,最好的处理方法是什么。
所以我想到的是(可能非常无效):
//Render class init
Key F1 = new Key(Keyboard.KEY_F1);
//Render method
renderMode = F1.ifPressed(delta);
if(renderMode)
{
//GL_LINES render
}
else
{
//GL_TRIANGLES render
}
//Key class
public class Key
{
int DELAY_TIME = 20;
int delay = 0;
int key;
boolean isActive = false;
boolean state = false;
public Key(int key)
{
this.key = key;
}
public boolean ifPressed(int delta)
{
if(!isActive)
{
if(Keyboard.isKeyDown(key))
{
isActive = true;
state = !state;
return state;
}
}
else if(delay <= DELAY_TIME * delta)
{
delay++;
}
else if(delay > DELAY_TIME)
{
delay = 0;
isActive = false;
}
return state;
一个通用的解决方案是拥有当前活动的操作/按下的键的列表。当针对某个键触发输入事件 PRESSED
(这通常由框架/OS 完成)时,您检查该键是否在列表中。
if (list.contains(key)) {
// not first time, so fire held
onKeyHeld(key);
}
else {
list.add(key);
onKeyPressed(key);
}
当触发输入事件 RELEASED
时,您执行以下操作:
list.remove(key);
onKeyReleased(key);
鼠标事件以类似的方式完成。
更好的是你可以用一些UserAction
class替换那些方法,这样它就可以绑定到键/鼠标事件。代码将更改为:
bind(Key.SPACE, new UserAction("Jump") {
public void onActionStart() {} // on key pressed
public void onAction() {} // on key held
public void onActionEnd() {} // on key released
});
我在游戏库中使用过这个解决方案,因此可以确认它有效。
我使用 LWJGL 制作 3d 图形。
我想做的是通过按指定键(例如 - F1)将呈现类型从 "GL_TRIANGLES" 更改为 "GL_LINES"。 因为高帧率 normal
if(Keyboard.isKeyDown(key))
{
//Action
}
在正常按下按钮期间最多可以打开和关闭 200 次。 总的来说,这对我来说很有趣,这个问题通常是如何解决的,最好的处理方法是什么。
所以我想到的是(可能非常无效):
//Render class init
Key F1 = new Key(Keyboard.KEY_F1);
//Render method
renderMode = F1.ifPressed(delta);
if(renderMode)
{
//GL_LINES render
}
else
{
//GL_TRIANGLES render
}
//Key class
public class Key
{
int DELAY_TIME = 20;
int delay = 0;
int key;
boolean isActive = false;
boolean state = false;
public Key(int key)
{
this.key = key;
}
public boolean ifPressed(int delta)
{
if(!isActive)
{
if(Keyboard.isKeyDown(key))
{
isActive = true;
state = !state;
return state;
}
}
else if(delay <= DELAY_TIME * delta)
{
delay++;
}
else if(delay > DELAY_TIME)
{
delay = 0;
isActive = false;
}
return state;
一个通用的解决方案是拥有当前活动的操作/按下的键的列表。当针对某个键触发输入事件 PRESSED
(这通常由框架/OS 完成)时,您检查该键是否在列表中。
if (list.contains(key)) {
// not first time, so fire held
onKeyHeld(key);
}
else {
list.add(key);
onKeyPressed(key);
}
当触发输入事件 RELEASED
时,您执行以下操作:
list.remove(key);
onKeyReleased(key);
鼠标事件以类似的方式完成。
更好的是你可以用一些UserAction
class替换那些方法,这样它就可以绑定到键/鼠标事件。代码将更改为:
bind(Key.SPACE, new UserAction("Jump") {
public void onActionStart() {} // on key pressed
public void onAction() {} // on key held
public void onActionEnd() {} // on key released
});
我在游戏库中使用过这个解决方案,因此可以确认它有效。