行动者相互作用,什么机制



我有一款libgdx游戏,我想在触碰和拖动精灵时移动它。如果它靠近其他精灵,我想突出它们,如果精灵被释放(修饰),并且精灵离另一个精灵足够近,我想自动滑动到合适的位置。

如果我使用actor, actor必须知道其他actor。

是否已经有一些机制来处理这个libgdx?我应该用别的东西而不是演员吗?

我可以有一个由演员调用的"manager"类,但我宁愿它是另一种方式,"manager"知道所有的演员

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

好消息是,您只需与其他检查一个actor,这将使 0 (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碰撞的信息

最新更新