使用串行监视器作为LibGDX游戏的按钮输入



我目前正在做一个项目,其中包括一个简短的演示游戏,我们决定使用LibGDX作为java库,并且我们需要使用arduino和/或树莓pi作为控制器输入。我的设想是制作一个使用arduino发送的串行监视器输入的输入处理器。我们目前对如何实现这一点感到困惑,甚至不确定您是否可以以这种方式使用输入处理器。

#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,以促进ardino和java应用程序之间的连接。出于这个原因,我们认为我们需要一个输入处理器,但由于我们目前是学生开发人员,我们无法确定是否是这样,以及我们如何实现它

我建议将您的串行侦听器移动到一个单独的专用线程,当它读取到一些内容时,它会调用回您的游戏。

通过这种方式,您的GDX游戏线程可以继续按预期运行,其中一个并行线程侦听输入,只在收到输入时通知游戏。

要实现这一点,请将侦听器打包到一个可运行的接口中:

// Runnable class, listens for serial input
public class serialListener implements Runnable {

@Override
public void run() {
// Listen for input, and calls corresponding methods in your game
}
}

然后在创建时将其发送到游戏的新线程中:

public class myGame extends GameAdapter {

private serialListener listener = new serialListener();
private Thread ListenerThread;

@Override
public void Create(){
ListenerThread = new Thread(listener);
ListenerThread.setDaemon(true);
ListenerThread.start();
}
}

如果这是你的问题的答案,我不会感到惊讶,但我认为有一个更容易的解决方案来实现你想要实现的
你可以使用Arduino作为键盘,并使用普通的libGDX输入库来控制游戏(就像使用普通键盘一样(,而不是像这样使用串行端口。你可以使用Arduino Leonardo或Arduino Pro Micro(以及它的任何廉价副本(,在你的电脑上注册为键盘。通过这种方式,您可以使用Arduino向计算机发送键输入,这些键输入被libGDX(和任何其他程序(识别,就像普通键盘一样。

键盘库可以这样使用:

#include "Keyboard.h"
#define left 2
#define right 3
void setup() {
//start a serial connection, because the keyboard uses this connection
Serial.begin(9600);
//create a keyboard
Keyboard.begin();
}

void loop() {
if(digitalRead(left))
{
Keyboard.write(KEY_LEFT_ARROW);// the KEY_LEFT_ARROW is defined in Keyboard.h
}
if(digitalRead(right))
{
Keyboard.write(KEY_RIGHT_ARROW);
}
// ...other keys...
delay(100);//debounce button
}

在项目的libGDX端,您不需要任何串行端口处理,只需要常规的libGDX输入处理。

我使用了类似的方法来构建演示者。代码在GitHub上。也许这有帮助。

最新更新