libgdx - actor交互,什么机制?
libgdx - actor interaction, what mechanism?
我有一个 libgdx 游戏,我想在触摸和拖动精灵时移动它。如果它靠近其他精灵,我想突出显示它们,如果精灵被释放(修饰)并且精灵足够接近另一个精灵,我想自动滑入到位。
所以如果我使用演员,演员必须了解其他演员。
在 libgdx 中是否已经有一些机制来处理这个问题?我应该使用演员以外的东西吗?
我可以有一个由演员调用的 "manager" class,但我宁愿反过来,"manager" 知道所有演员。
Scene2d 中没有比遍历演员并检查他们的位置更简单的机制了。如果舞台上有很多演员,操作可能会很昂贵,因为需要 O(n2) (你必须检查每个演员每隔一个)。
好消息是你只需要检查一个演员与其他演员,这将使 O(n) 并且是完全可以接受的.
你也不需要任何外部管理器来检查 actor——当 actor 被抓取时你应该设置它的标志,如果标志在 act actor 的方法中为真,你应该检查其他演员 - 当然你需要创建自己的 MyActor class extending 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 物理引擎)碰撞系统。这个想法是给每个演员一个 body 并且 body 应该有比演员更大的夹具。然后在碰撞时你可以处理接触 - 但是如果你还没有使用 box2d 就完全不值得为此实现它.
阅读有关 Box2d 碰撞的更多信息here。
我有一个 libgdx 游戏,我想在触摸和拖动精灵时移动它。如果它靠近其他精灵,我想突出显示它们,如果精灵被释放(修饰)并且精灵足够接近另一个精灵,我想自动滑入到位。
所以如果我使用演员,演员必须了解其他演员。
在 libgdx 中是否已经有一些机制来处理这个问题?我应该使用演员以外的东西吗?
我可以有一个由演员调用的 "manager" class,但我宁愿反过来,"manager" 知道所有演员。
Scene2d 中没有比遍历演员并检查他们的位置更简单的机制了。如果舞台上有很多演员,操作可能会很昂贵,因为需要 O(n2) (你必须检查每个演员每隔一个)。
好消息是你只需要检查一个演员与其他演员,这将使 O(n) 并且是完全可以接受的.
你也不需要任何外部管理器来检查 actor——当 actor 被抓取时你应该设置它的标志,如果标志在 act actor 的方法中为真,你应该检查其他演员 - 当然你需要创建自己的 MyActor class extending 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 物理引擎)碰撞系统。这个想法是给每个演员一个 body 并且 body 应该有比演员更大的夹具。然后在碰撞时你可以处理接触 - 但是如果你还没有使用 box2d 就完全不值得为此实现它.
阅读有关 Box2d 碰撞的更多信息here。