Java 使用触摸板播放投掷对象

Java 使用触摸板播放投掷对象,java,gwt,playn,2d-games,Java,Gwt,Playn,2d Games,我正在使用PlayN构建一个涉及石头的游戏,用户必须在物理世界中移动(具有重力等)。我希望用户能够使用触摸板直接操纵石头,并通过拖动和投掷石头来提供速度 现在我有一个实现,每个石头都在自己的层上,我在石头层上有一个监听器,它将停用这个石头体的物理(当用户抓住它时),并在拖动完成后重新激活 问题是监听器回调的执行似乎有延迟,这意味着在考虑重新激活物理引擎之前会显示许多帧,从而导致在用户停止抓取后石头掉落延迟 有没有其他方法来处理这种行为?我错过什么了吗 谢谢 layer.addListener

我正在使用PlayN构建一个涉及石头的游戏,用户必须在物理世界中移动(具有重力等)。我希望用户能够使用触摸板直接操纵石头,并通过拖动和投掷石头来提供速度

现在我有一个实现,每个石头都在自己的层上,我在石头层上有一个监听器,它将停用这个石头体的物理(当用户抓住它时),并在拖动完成后重新激活

问题是监听器回调的执行似乎有延迟,这意味着在考虑重新激活物理引擎之前会显示许多帧,从而导致在用户停止抓取后石头掉落延迟

有没有其他方法来处理这种行为?我错过什么了吗

谢谢

  layer.addListener(new Pointer.Adapter() {

        @Override
        public void onPointerStart(Event event) {
            suspendPhysik = true;
            getBody().setActive(!suspendPhysik);

        }

        @Override
        public void onPointerEnd(Event event) {
            suspendPhysik = false;
            getBody().setActive(!suspendPhysik);
            long deltatime = System.currentTimeMillis() - prevTimestamp;
            Vec2 velocity = new Vec2((event.x()
                    * NewGame.physUnitPerScreenUnit - prevX)
                    / deltatime,
                    (event.y() * NewGame.physUnitPerScreenUnit - prevX)
                            * NewGame.physUnitPerScreenUnit / deltatime);
            getBody().setLinearVelocity(velocity);
        }

        @Override
        public void onPointerDrag(Event event) {
            x = event.x() * NewGame.physUnitPerScreenUnit;
            y = event.y() * NewGame.physUnitPerScreenUnit;
            setPos(event.x() * NewGame.physUnitPerScreenUnit, event.y()
                    * NewGame.physUnitPerScreenUnit);
        }

    });`

发现了一个关于playN的有趣的演示

在本例中,作者使用以下代码:

touch().setListener(new Touch.Adapter() {           
    @Override
    public void onTouchStart(Event[] touches) {
      // Process touch events into a zoom start position.
    }   
    @Override
    public void onTouchMove(Event[] touches) {
      // Update zoom based on touches.
    }              
});
此链接包含Touch.Adapter的文档

所以试试这个:

layer.addListener(new Touch.Adapter() {         
    @Override
    public void onTouchStart(Touch.Event[] touches) {
        suspendPhysik = true;
        getBody().setActive(!suspendPhysik);
    }   

    @Override
    public void onTouchMove(Touch.Event[] touches) {
        suspendPhysik = false;
        getBody().setActive(!suspendPhysik);
        long deltatime = System.currentTimeMillis() - prevTimestamp;
        Vec2 velocity = new Vec2((touches[0].x() * NewGame.physUnitPerScreenUnit - prevX) / deltatime, (event.y() * NewGame.physUnitPerScreenUnit - prevX) * NewGame.physUnitPerScreenUnit / deltatime);
        getBody().setLinearVelocity(velocity);
    }   

    @Override
public void onTouchMove(Touch.Event[] touches)  
    {
        x = touches[0].x() * NewGame.physUnitPerScreenUnit;
        y = touches[0].y() * NewGame.physUnitPerScreenUnit;
        setPos(x * NewGame.physUnitPerScreenUnit, y * NewGame.physUnitPerScreenUnit);
    }   
  });

我发现处理此类问题的最佳方法实际上是在Box2d中使用鼠标点。 暂停physic不是正确的方法,因为它会破坏模拟(除其他外,碰撞时不会考虑身体)

我将发布一些我发现的链接,解释不同的可能方法