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

标签 java arduino libgdx serial-port

我目前正在开发一个项目,其中包括一个简短的演示游戏,我们决定使用 LibGDX 作为 java 库,并且需要使用 arduino 和/或树莓派作为 Controller 输入。我的假设是制作一个输入处理器,使用 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 中接口(interface):

    // 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
        }
    }

然后在创建后将其分派(dispatch)到游戏的新线程中:

    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();
        }
    }

关于java - 使用串行监视器作为 LibGDX 游戏的按钮输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67198183/

相关文章:

java - 无法找到 url 状态/无法 ping 一个 url(启用 SSL 的主机)并处理无效的 SSL 证书

java - 用正则表达式替换 Java 中大括号 { } 之间的所有文本

opengl-es - 使用 OpenGL ES 2.0 进行模板制作

java - 为什么我不能在 html 上启动我的 LibGDX 项目?

java - 涉及两个扩展的选择冲突 :

java - NullPointerException - Java - WCF 之上的 Web 服务客户端(使用 WS-Security)

java - ESP8266 上的 Websocket 客户端不向 spring-boot 服务器发送数据

Android 到 Arduino Leonardo 通信 - 通过 OTG 电缆发送和接收命令

c++ - 如何使用 LiquidCrystal 在 Arduino 中创建我自己的库?

java - LibGDX中如何暂停定时器delaySeconds