Перевести JMonkey Tutorial на JRuby - PullRequest
3 голосов
/ 23 марта 2012

У меня есть все учебные пособия для начинающих # 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) {
    ...
  }
}

Как это может работать?

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Как описано в Вызов Java из JRuby , вы можете использовать преобразование замыкания, где блоки могут использоваться для определения поведения интерфейса Java. Должно работать что-то вроде следующего:

l = lambda { |name, pressed, tpf| running = !running if name == 'Pause' && !pressed }
input_managers.add_listener(l, ['Left', 'Right', 'Rotate'])
0 голосов
/ 31 мая 2015

Я обернул слушатель действия в метод, который возвращал бы объект, который включает ActionListener, используя метод JRuby: impl

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

Создание собственного класса может быть лучшим вариантом, так как он намного менее многословен и легче для чтения и понимания.

0 голосов
/ 05 апреля 2012

Ах, нашел ответ. Оказывается, они были анонимными внутренними классами. В 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
...