0

我有一个小问题。我在做空气曲棍球比赛。我想要拖放玩家身体,以便它可以碰撞/给予物理世界中的其他对象但是!我确实希望我的身体(触摸)像我的手指一样粘住和移动(并且仍然有力量!)我在下面给你的代码几乎达到了我想要的效果,但是当我移动我的手指时......我接触的区域。如何让它粘住我的手指仍然算力?有人可以帮我修改这段代码吗?十分感谢 :)!

private Body groundBody = null;
public MouseJoint createMouseJoint(AnimatedSprite box , float x, float y){
        final Body boxBody = this.mPhysicsWorld.getPhysicsConnectorManager().findBodyByShape(box);


        float pixelToMeteRatio=64;
    Vector2 v =boxBody.getWorldPoint(new Vector2(x/pixelToMeteRatio, y/pixelToMeteRatio));

        MouseJointDef mjd = new MouseJointDef();
        mjd.bodyA                               = groundBody;
        mjd.bodyB                               = boxBody;
        mjd.dampingRatio                = 1f;
        mjd.frequencyHz             = 30;
        mjd.maxForce                    = (float) (200.0f * boxBody.getMass());
        mjd.collideConnected            = true;
        mjd.target.set(v);
        return (MouseJoint) this.mPhysicsWorld.createJoint(mjd);
}

MouseJoint mjActive = null;
private float pixelToMeteRatio = PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT;
@Override
public boolean onAreaTouched(
                final TouchEvent        pSceneTouchEvent,
                final ITouchArea        pTouchArea      ,
                final float             pTouchAreaLocalX,
                final float             pTouchAreaLocalY )
{

        if(pSceneTouchEvent.getAction() == MotionEvent.ACTION_DOWN) {

                this.runOnUpdateThread(new Runnable() {
                        @Override
                        public void run() {

                        final AnimatedSprite face = (AnimatedSprite)pTouchArea; //The touched body
                        //If we have a active MouseJoint, we are just moving arround don't create an 2nd one.
                        if( mjActive == null)
                        {
                                Vector2 vector = new Vector2(pTouchAreaLocalX/pixelToMeteRatio,pTouchAreaLocalY/pixelToMeteRatio);
                                //=====================================
                                // GROUNDBODY - Used for the MouseJoint
                                //=====================================
                                BodyDef groundBodyDef = new BodyDef();
                                groundBodyDef.position.set(vector);
                                groundBody      = mPhysicsWorld.createBody(groundBodyDef);
                                //====================================
                                // CREATE THE MOUSEJOINT
                                //====================================
                                mjActive        = createMouseJoint(face, pTouchAreaLocalX, pTouchAreaLocalY);
                        }
                }});

                return true;
        }

return false;
}


@Override
    public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {

            if(this.mPhysicsWorld != null) {


            if(pSceneTouchEvent.getAction() == MotionEvent.ACTION_MOVE) {

                    this.runOnUpdateThread(new Runnable() {
                            @Override
                            public void run() {

                            if( mjActive != null ){ //If the MJ is active move it ..

                                    // =========================================
                                    // MOVE THE MOUSEJOINT WITH THE FINGER..
                                    // =========================================
                                    Vector2 vec = new Vector2(pSceneTouchEvent.getX()/pixelToMeteRatio, pSceneTouchEvent.getY()/pixelToMeteRatio);
                                    mjActive.setTarget(vec);

                            }
                    }});
                    return true;
            }

            //===========================================
            // RELEASE THE FINGER FROM THE SCENE..
            //===========================================
            if(     pSceneTouchEvent.getAction() == MotionEvent.ACTION_UP     ||     pSceneTouchEvent.getAction() == MotionEvent.ACTION_CANCEL
              ) {

                    this.runOnUpdateThread(new Runnable() {
                            @Override
                            public void run() {


                            if( mjActive != null )
                            {
                                    //======================================
                                    // DESTROY OUR MOUSEJOINT
                                    //======================================
                                    mPhysicsWorld.destroyJoint(mjActive);
                               //     groundBody.setTransform(pSceneTouchEvent.getX(), pSceneTouchEvent.getY(), groundBody.get);
                                    mPhysicsWorld.destroyBody(groundBody);
                                    mjActive = null;
                            }

                    }});

         //         groundBody.setLinearVelocity(0,0);
                    return true;
            }
            }       
            return false;
4

1 回答 1

0

调整以下参数:dampingRatio、frequencyHz、maxForce。此外,降低身体的质量应该会有所帮助。我认为将阻尼设置为非常接近 1,频率稍微高一点并且力非常高应该可以解决问题。

于 2012-07-24T13:36:13.103 回答