Java libgdx-参与者交互,什么机制?

Java libgdx-参与者交互,什么机制?,java,libgdx,2d,collision-detection,Java,Libgdx,2d,Collision Detection,我有一个libgdx游戏,当一个精灵被触摸和拖动时,我想移动它。如果它接近其他精灵,我想突出显示它们,如果精灵被释放(触摸),并且精灵足够接近另一个精灵,我想自动滑动到位 因此,如果我使用演员,演员必须了解其他演员 libgdx中已经有一些机制来处理这个问题了吗?我应该使用演员以外的东西吗 我可以有一个由演员调用的“经理”类,但我宁愿它是另一种方式,“经理”知道所有演员的情况。在场景2D中没有比迭代演员并检查他们的位置更简单的机制了。如果舞台上有很多演员,操作成本可能会很高,因为使用了O(n2)

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

因此,如果我使用演员,演员必须了解其他演员

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


我可以有一个由演员调用的“经理”类,但我宁愿它是另一种方式,“经理”知道所有演员的情况。

在场景2D中没有比迭代演员并检查他们的位置更简单的机制了。如果舞台上有很多演员,操作成本可能会很高,因为使用了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;
}

...
类MyActor扩展了Actor
{
...
公共布尔值AmibeingDrawed=false;
公共无效法案(浮动三角洲)
{
超级法案(德尔塔);
如果(正在拖动)
{
Vector2位置=新的Vector2(this.getX(),this.getY());
对于(参与者:this.getStage().getActors())
{
如果(actor==this)继续;
if(position.dst)(新向量2(actor.getX(),actor.getY()<阈值距离)
{
这个.setPosition(actor.getX(),actor.getY());
}
}
}
}
}
//drag的侦听器方法
public void dragStart(InputEvent事件、浮点x、浮点y、int指针)
{ 
((MyActor)event.getTarget()).amibeingDrawed=true;
}
public void dragStop(InputEvent事件、浮点x、浮点y、int指针)
{ 
((MyActor)event.getTarget()).amibeingDrawed=false;
}
...
当然也有几何alghoritms来优化这样的情况,但在如此简单的使用中,我认为不值得处理它们


如果您想尝试其他方法,可以使用(默认Libgdx物理引擎)碰撞系统。这个想法是给每个演员一个身体,身体应该有比演员更大的固定装置。然后在碰撞时,你可以处理接触-,但是如果你还没有使用box2d,那么仅仅为了这个就完全不值得实现它

了解有关Box2d碰撞的更多信息