有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

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


共 (1) 个答案

  1. # 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的更多信息