【问题标题】:libgdx - actor interaction, what mechanism?libgdx - 演员交互,什么机制?
【发布时间】:2015-10-18 01:33:03
【问题描述】:

我有一个 libgdx 游戏,我想在触摸和拖动精灵时移动它。如果它靠近其他精灵,我想突出显示它们,并且如果精灵被释放(修饰)并且精灵与另一个精灵足够接近,我想自动滑入位置。

所以如果我使用演员,演员必须了解其他演员。

在 libgdx 中是否已经有一些机制来处理这个问题?我应该使用演员以外的其他东西吗?

我可以有一个由演员调用的“经理”类,但我宁愿反过来,“经理”知道所有演员。

【问题讨论】:

    标签: java libgdx 2d collision-detection


    【解决方案1】:

    在 Scene2d 中没有比迭代演员并检查他们的位置更简单的机制了。如果舞台上有很多演员,则操作可能会很昂贵,因为需要 O(n2)(您必须检查每个演员与其他演员)。

    好消息是您只需检查一个演员与其他演员,这将使 O(n) 并且完全可以接受。

    您也不需要任何外部经理来检查演员 - 只是当演员被抓住时,您应该设置标志,如果标志在 act 演员的方法中为真,您应该检查其他演员 -当然,您需要创建自己的 MyActor 类来扩展 Actor

    class MyActor extends Actor
    {
        ...
    
        public boolean amIBeingDragged = false;
    
        public void act(float delta)
        {
            super.act(delta);
    
            if( amIBeingDragged )
            {
                Vector2 position = new Vector2(this.getX(), this.getY());
    
                for(Actor actor : this.getStage().getActors())
                {
                     if(actor == this) continue;
    
                     if(position.dst( new Vector2( actor.getX(), actor.getY() < thresholdDistance )
                     {
                         this.setPosition( actor.getX(), actor.getY() );
                     }
                }
            }
        }
    }
    
    //drag's listener methods
    public void dragStart(InputEvent event, float x, float y, int pointer)
    { 
        ( (MyActor) event.getTarget() ).amIBeingDragged = true;
    }
    
    public void dragStop(InputEvent event, float x, float y, int pointer)
    { 
        ( (MyActor) event.getTarget() ).amIBeingDragged = false;
    }
    
    ...
    

    当然有几何算法来优化这种情况,但在如此简单的用法中,我认为不值得处理它们。


    如果你想尝试一些替代方案,你可以使用Box2D(默认的 Libgdx 物理引擎)碰撞系统。这个想法是给每个演员一个身体,身体应该有比演员更大的固定装置。然后在发生碰撞时,您可以处理联系人 - 但如果您还没有使用 box2d,则完全不值得为此实施它

    阅读有关 Box2d 碰撞的更多信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多