首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与JRuby结合使用Artemis

与JRuby结合使用Artemis
EN

Stack Overflow用户
提问于 2014-06-14 13:02:28
回答 1查看 87关注 0票数 0

我正在尝试使用来自JRuby的JRuby。下面是我试图转换为JRuby的Java代码:

代码语言:javascript
复制
import com.artemis.Aspect;
import com.artemis.Component;
import com.artemis.Entity;
import com.artemis.World;
import com.artemis.systems.EntityProcessingSystem;

public class MyGame {

    private World world;

    public MyGame() {
        world = new World();

        Entity e = world.createEntity();
        e.addComponent(new Position());
        e.addToWorld();

        world.setSystem(new ConsoleOutputSystem());
        world.initialize();
        for(int i = 0; i < 10; i++) {
            world.setDelta(60);
            world.process();
        }
    }

    public static void main(String[] args) {
        new MyGame();
    }
}

class Position extends Component {

    public int x;
    public int y;

    public Position() {
        this.x = 0;
        this.y = 0;
    }
}

class ConsoleOutputSystem extends EntityProcessingSystem {

    public ConsoleOutputSystem() {
        super(Aspect.getAspectForAll(Position.class));
        System.out.println("In system constructor");
    }

    @Override
    protected void process(Entity entity) {
        System.out.println("processing");
        System.out.println(entity.getUuid());
    }

}

当我执行此操作时,输出如下:

代码语言:javascript
复制
In system constructor
processing
9e8a24a8-b778-4926-b305-5a426a2f0ce1
processing
...

ConsoleOutputSystem.process()方法被调用十次。以下是我的JRuby代码:

代码语言:javascript
复制
require 'artemis.jar'

java_import com.artemis.Entity
java_import com.artemis.World
java_import com.artemis.Component
java_import com.artemis.Aspect
java_import com.artemis.systems.EntityProcessingSystem

class MyGame 

  attr_reader :world

  def initialize

    @world = World.new()
    e = @world.create_entity()
    e.add_component(Position.new())
    e.add_to_world()
    @world.set_system(ConsoleOutputSystem.new())
    #@world.initialize
    @world.java_send :initialize
    10.times do
      @world.set_delta(60)
      @world.process()
    end
  end

end

class Position < Component

    attr_accessor :x, :y

    def initialize ()
        @x = 0
        @y = 0
    end

end

class ConsoleOutputSystem < EntityProcessingSystem

    def initialize()
      puts 'in system constructor'
      super(Aspect.get_aspect_for_all(Position))
    end

    java_signature 'protected void process(Entity)'
    def process(entity)
      puts 'process'
      puts entity.getUuid
    end

end


MyGame.new()

产出如下:

代码语言:javascript
复制
in system constructor

因此调用ConsoleOutputSystem构造函数,但不调用ConsoleOutputSystem.process()。我尝试同时使用@world.initialize和@world.java_send :初始化,输出是相同的。我尝试的另一件事是向java_signature ()方法中添加ConsoleOutputSystem.process‘受保护的无效进程(实体)’。

Artemis包中的其他几个类都保护了名为initialize()的方法,但我不确定这是否与我的问题有关。

编辑

自从我贴出这个问题以来,我已经取得了一些进展。@world.java_send :初始化工作,并调用正确的方法。不起作用的是Aspect.get_aspect_for_all()。在Java中,Aspect.getAspectForAll()期望

代码语言:javascript
复制
Class<? extends Component> , Class<? extends Component>[]

作为争论。在JRuby中,这两种方法都不能作为Aspect.getAspectForAll()的参数:

代码语言:javascript
复制
Position
Position.class
Position.java_class
Position.java_proxy_class

唯一起作用的是预先创建一个职位实例,并将其类传递给Aspect.getAspectForAll():

代码语言:javascript
复制
@position_class = Position.new().getClass()

下面是它工作的代码,但它感觉就像一个假话:

代码语言:javascript
复制
require 'artemis.jar'

java_import com.artemis.Entity
java_import com.artemis.World
java_import com.artemis.Component
java_import com.artemis.ComponentType
java_import com.artemis.ComponentMapper
java_import com.artemis.Aspect
java_import com.artemis.systems.EntityProcessingSystem

class MyGame 

  attr_reader :world

  def initialize

    @world = World.new()

    e = @world.create_entity()
    e.add_component(Position.new())
    e.add_component(Velocity.new())
    e.add_to_world()

    @world.set_system(ConsoleOutputSystem.new(@world))
    @world.java_send :initialize


    5.times do
      @world.set_delta(60)
      @world.process
    end

  end

end

class Position < Component

    attr_accessor :x, :y

    def initialize ()
        @x = rand(100)
        @y = rand(100)
    end

end

class Velocity < Component

  attr_accessor :v

  def initialize()
    @v = 1.43
  end

end

class ConsoleOutputSystem < EntityProcessingSystem

  attr_accessor :position_class, :velocity_class

    def initialize(world)

      @position_class = Position.new().getClass()
      @velocity_class = Velocity.new().getClass()

      puts "@position_class: #{@position_class}"
      puts "Position: #{Position}"
      puts "Position.class: #{Position.class}"
      puts "Position.java_class: #{Position.java_class}"
      puts "Position.java_proxy_class: #{Position.java_proxy_class}"

      super(Aspect.get_aspect_for_all(@position_class, @velocity_class))

    end

    def process(entity)

      puts 'process'
      puts entity.getUuid

      position = entity.get_component(@position_class)
      velocity = entity.get_component(@velocity_class)

      position.x += 1
      position.y += 1
      velocity.v += 1

      puts position.x
      puts position.y
      puts velocity.v
      puts '----------'

    end

end

game = MyGame.new()

输出.

代码语言:javascript
复制
puts "@position_class: #{@position_class}"
puts "Position: #{Position}"
puts "Position.class: #{Position.class}"
puts "Position.java_class: #{Position.java_class}"
puts "Position.java_proxy_class: #{Position.java_proxy_class}"

是:

代码语言:javascript
复制
@position_class: org.jruby.proxy.com.artemis.Component$Proxy0
Position: Position
Position.class: Class
Position.java_class: com.artemis.Component
Position.java_proxy_class: org.jruby.javasupport.proxy.JavaProxyClass

因此,我的问题是如何在不创建Position类实例的情况下获得org.jruby.proxy.com.artemis.Component$Proxy0?

编辑2

感谢Namek的回答,这里是工作的代码。它用

代码语言:javascript
复制
@position_class = Position.java_proxy_class.java_class
@velocity_class = Velocity.java_proxy_class.java_class

因此,我不需要创建JRuby类的实例来获得它的Java类:

代码语言:javascript
复制
require 'artemis.jar'

java_import com.artemis.Entity
java_import com.artemis.World
java_import com.artemis.Component
java_import com.artemis.ComponentType
java_import com.artemis.ComponentMapper
java_import com.artemis.Aspect
java_import com.artemis.systems.EntityProcessingSystem


class MyGame 

  attr_reader :world

  def initialize

    @world = World.new()

    e = @world.create_entity()
    e.add_component(Position.new())
    e.add_component(Velocity.new())
    e.add_to_world()

    @world.set_system(ConsoleOutputSystem.new(@world))
    @world.java_send :initialize


    5.times do
      @world.set_delta(60)
      @world.process
    end

  end

end


class Position < Component

    attr_accessor :x, :y

    def initialize ()
        @x = rand(100)
        @y = rand(100)
    end

end


class Velocity < Component

  attr_accessor :v

  def initialize()
    @v = 1.43
  end

end


class ConsoleOutputSystem < EntityProcessingSystem

  attr_accessor :position_class, :velocity_class

    def initialize(world)

      @position_class = Position.java_proxy_class.java_class
      @velocity_class = Velocity.java_proxy_class.java_class

      super(Aspect.get_aspect_for_all(@position_class, @velocity_class))

    end

    def process(entity)

      puts 'process'
      puts entity.getUuid

      position = entity.get_component(@position_class)
      velocity = entity.get_component(@velocity_class)

      position.x += 1
      position.y += 1
      velocity.v += 1

      puts position.x
      puts position.y
      puts velocity.v
      puts '----------'

    end

end


game = MyGame.new()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-31 13:54:20

似乎您当前的问题将在这里讨论:http://jira.codehaus.org/browse/JRUBY-672

尝试像这样得到您的Java类:

Position.java_proxy_class.java_class

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24220204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档