我目前正在做一个项目,包括一个简短的演示游戏,我们决定使用libgdx作为java库,我们需要使用arduino和/或raspberry pi作为控制器输入。我的设想是制作一个使用arduino发送的串行监视器输入的输入处理器。我们目前正被困在如何实现这一点,甚至不确定您是否可以用这种方式使用inputprocessor。
# define left 2
# define right 3
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(left))
{
goLeft();
}
if(digitalRead(right))
{
goRight();
}
delay(100);
}
void goLeft()
{
Serial.println(1000);
}
void goRight()
{
Serial.println(500);
}
这是在arduino上运行的代码。这是一个简单的设置,只是串行打印2个不同的数字,取决于按下哪个按钮,以后在游戏中用作左或右方向。
port = SerialPort.getCommPort("COM4");
if(port.openPort()) {
System.out.println("Successfully opened the port.");
} else {
System.out.println("Unable to open the port.");
return;
}
port.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 0, 0);
data = new Scanner(port.getInputStream());
if(data.hasNextLine())
{
int number = 0;
try{number = Integer.parseInt(data.nextLine());}catch(Exception e){}
if(number == 500)
{
bucket.x += 200 * Gdx.graphics.getDeltaTime();
}
if(number == 1000)
{
bucket.x -= 200 * Gdx.graphics.getDeltaTime();
}
}
这是我们游戏中render()函数当前使用的代码。然而,所发生的是,游戏将只继续渲染时,有一个在串行监视器下一行,不会在任何其他时间渲染。我们目前正在使用java库jserial comm来促进ardiono和java应用程序之间的连接。出于这个原因,我们认为我们将需要一个输入处理器,但由于我们目前是学生开发人员,我们无法弄清楚,如果是这样的情况下,我们可以如何实现它。
2条答案
按热度按时间ippsafx71#
如果这能回答您的问题,我不是舒尔,但我认为有一个更简单的解决方案可以帮助您实现目标:
您可以使用arduino作为键盘,使用普通的libgdx输入库来控制游戏(就像使用普通键盘一样),而不是像这样使用串行端口。您可以使用arduino leonardo或arduino pro micro(以及任何便宜的副本),将其注册为计算机上的键盘。通过这种方式,您可以使用arduino向计算机发送按键输入,这些按键输入可以被libgdx(和任何其他程序)识别,就像识别普通键盘一样。
键盘库可以这样使用:
在项目的libgdx端,您不需要任何串行端口处理,只需要通常的libgdx输入处理。
我用了一些类似的东西来构建一个演示者。代码在github上。也许有帮助。
5jvtdoz22#
我建议将串行侦听器移动到一个单独的专用线程,当它读取某些内容时,该线程将回调到您的游戏。
通过这种方式,gdx游戏线程可以继续按预期运行,并行线程侦听输入,只在收到输入时通知游戏。
要实现这一点,请将侦听器打包到可运行的接口中:
然后在创建时从游戏中发送一个新线程: