使用串行监视器作为 LibGDX 游戏的按钮输入
using serial monitor as a button input for LibGDX game
我目前正在做一个包含一个简短的演示游戏的项目,我们决定使用 LibGDX 作为 java 库,我们需要使用 arduino and/or raspberry 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() 函数当前使用的代码。然而,发生的事情是,游戏只会在串行监视器中有 nextLine 时继续呈现,而不会在任何其他时间呈现。我们目前正在使用 java 库 jserial comm 以促进 ardiono 和 java 应用程序之间的连接。出于这个原因,我们认为我们需要一个输入处理器,但是由于我们目前是学生开发人员,我们无法确定是否是这种情况以及我们如何实现它。
我建议将您的串行侦听器移动到一个单独的专用线程,该线程在读取内容时回调您的游戏。
这样您的 GDX 游戏线程可以像您预期的那样继续 运行,并行线程侦听输入,仅在收到输入时通知游戏。
为此,将您的侦听器打包到 Runnable 接口中:
// 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(和任何其他程序)识别,就像识别普通键盘一样。
Keyboard 库可以这样使用:
#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 input handling。
我用过类似的东西来构建演示者。代码在 GitHub 上。也许有帮助。
我目前正在做一个包含一个简短的演示游戏的项目,我们决定使用 LibGDX 作为 java 库,我们需要使用 arduino and/or raspberry 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() 函数当前使用的代码。然而,发生的事情是,游戏只会在串行监视器中有 nextLine 时继续呈现,而不会在任何其他时间呈现。我们目前正在使用 java 库 jserial comm 以促进 ardiono 和 java 应用程序之间的连接。出于这个原因,我们认为我们需要一个输入处理器,但是由于我们目前是学生开发人员,我们无法确定是否是这种情况以及我们如何实现它。
我建议将您的串行侦听器移动到一个单独的专用线程,该线程在读取内容时回调您的游戏。
这样您的 GDX 游戏线程可以像您预期的那样继续 运行,并行线程侦听输入,仅在收到输入时通知游戏。
为此,将您的侦听器打包到 Runnable 接口中:
// 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(和任何其他程序)识别,就像识别普通键盘一样。
Keyboard 库可以这样使用:
#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 input handling。
我用过类似的东西来构建演示者。代码在 GitHub 上。也许有帮助。