如何在Android中使用鼠标连接?

时间:2011-09-29 08:40:49

标签: android box2d drag cocos2d-android

我想在Java for Android中使用MouseJoint。我是box2d和cocos2d的新手。我不知道如何使用鼠标关节。

1 个答案:

答案 0 :(得分:3)

我建议您查看this教程示例。从它复制(对不起,我不喜欢破碎的链接:))...

你在MouseJoint的帮助下拖动你的身体,它会与世界上的其他身体发生碰撞并对它们施加力量。

Box2d - 手动 - http://www.box2d.org/manual.html#_Toc258082974

8.10鼠标关节

在测试床中使用鼠标关节用鼠标操纵身体。它试图将身体上的一个点朝向光标的当前位置。轮换没有限制。

鼠标关节定义具有目标点,最大力,频率和阻尼比。目标点最初与身体的锚点重合。当多个动态物体相互作用时,最大力用于防止剧烈反应。你可以根据自己的喜好选择它。频率和阻尼比用于产生类似于距离关节的弹簧/阻尼效果。

许多用户都试图让鼠标关节适应游戏。用户通常希望实现精确定位和瞬时响应。鼠标关节在该上下文中不能很好地工作。您可能希望考虑使用运动物体。

让我们开始......

  • 你必须创建你的PhysicWorld并且至少有一个身体。 (查看PhysicExample如何...)

- MouseJoint方法

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

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

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

- 触摸身体

我们必须覆盖onAreaTouched方法,以在触摸位置创建MouseJoint锚点。

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        = PhysicsJumpExample.this.createMouseJoint(face, pTouchAreaLocalX, pTouchAreaLocalY);
                        }
                }});

                return true;
        }

return false;
}

- 移动身体

我们正在将手指移动到场景上,因此我们也必须移动MouseJoint。 如果我们释放手指......我们必须销毁MouseJoint ..

@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..
                                // =========================================
                                Vecotr2 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
                                //======================================
                                PhysicsJumpExample.this.mPhysicsWorld.destroyJoint(mjActive);
                                PhysicsJumpExample.this.mPhysicsWorld.destroyBody(groundBody);
                                mjActive = null;
                        }

                }});

                return true;
        }

        return false;
}

供参考: 为了满足您的需求,您必须使用此设置(在createMouseJoint方法中)

mjd.dampingRatio = 0.2f;

mjd.frequencyHz = 30;

mjd.maxForce = (float) (200.0f * boxBody.getMass());