Java 将JMonkey教程翻译成JRuby

Java 将JMonkey教程翻译成JRuby,java,jruby,code-translation,jmonkeyengine,Java,Jruby,Code Translation,Jmonkeyengine,我已经翻译了到初学者5的所有教程,但我对Java还不够了解,不知道如何移植这些行: private ActionListener actionListener = new ActionListener() { public void onAction(String name, boolean keyPressed, float tpf) { if (name.equals("Pause") && !keyPressed) { isRunning = !is

我已经翻译了到初学者5的所有教程,但我对Java还不够了解,不知道如何移植这些行:

private ActionListener actionListener = new ActionListener() {
  public void onAction(String name, boolean keyPressed, float tpf) {
    if (name.equals("Pause") && !keyPressed) {
      isRunning = !isRunning;
    }
  }
};

private AnalogListener analogListener = new AnalogListener() {
  public void onAnalog(String name, float value, float tpf) {
    ...
  }
}
这是如何工作的?

如中所述,您可以使用闭包转换,其中块可用于定义Java接口行为。类似于以下的方法应该可以工作:

l = lambda { |name, pressed, tpf| running = !running if name == 'Pause' && !pressed }
input_managers.add_listener(l, ['Left', 'Right', 'Rotate'])

啊,找到答案了。事实证明,它们是匿名的内部类。在JRuby中,您只需创建一个实现Java接口的类,如下所示:

class RBActionListener
  # This is how you implement Java interfaces from JRuby
  include com.jme3.input.controls.ActionListener

  def initialize(&on_action)
    @on_action = on_action
  end

  def onAction(*args)
    @on_action.call(*args)
  end
end

class HelloJME3
  # blah blah blah code blah blah blah

  def register_keys
    # ...
    ac = RBActionListener.new {|name, pressed, tpf @running = !@running if name == "Pause" and !pressed}
    input_manager.add_listener(ac, "Pause")
  end
end

我将action listener包装在一个方法中,该方法将使用JRuby的:impl方法返回包含ActionListener的对象

def isRunningActionListener
  return ActionListener.impl do
    |command, name, keyPressed, tpf|
      case command
        when :onAction
          if name.eql?("Pause") && !keyPressed
            isRunning = !isRunning;
          end
      end
   end
end
您还可以创建自己的ActionListener类,其中包括ActionListener

class YourActionListener
  include ActionListener
  def onAction command, name, keyPressed, tpf
    #your code here
  end
end

创建自己的类可能是更好的选择,因为它不那么冗长,更容易阅读和理解。

我仍然无法让它工作;您的方式会引发错误
org.jruby.exceptions.RaiseException:(TypeError)无法将类org.jruby.RubyArray的实例转换为类java.lang.String
。如果我将它分离成单独的参数或调用
到_java
,它不会执行块。我不知道怎么了。文件(由另一个设置类路径的文件加载)@Jwosty:您可以尝试将
@
添加到输入管理器中,然后将数组转换为逗号分隔的:
@input\u manager.add\u listener(l,'Left','Right','Rotate')
varargs可能是这里的问题。下面是我用来编写上述代码的一个简单示例:它不能转换为实例变量,因为它是一个方法(您的意思是
@input\u manager=input\u manager
?),把论点分开似乎也不管用。公开这些翻译的教程不是一件好事吗?:)哦,那可能会,;我只是不知道它在我的电脑上的什么地方,如果真的,因为它已经很久了。。。