如何在Android中使用鼠标关节?

如何在Android中使用鼠标关节?,android,box2d,drag,cocos2d-android,Android,Box2d,Drag,Cocos2d Android,我想在Android的Java中使用鼠标点。我是box2d和cocos2d的新手。我不知道如何使用鼠标关节。我建议您查看教程示例。从中复制(抱歉,我不喜欢断开的链接:) 在鼠标点的帮助下拖动身体,它将与世界上的其他身体碰撞并对其施加力 Box2d-手动- 8.10鼠标关节 鼠标关节在试验台中用于使用鼠标操纵身体。它试图将实体上的一个点推向光标的当前位置。对旋转没有限制 鼠标关节定义具有目标点、最大力、频率和阻尼比。目标点最初与主体的锚定点重合。当多个动态物体相互作用时,最大力用于防止剧烈反应。你

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

我建议您查看教程示例。从中复制(抱歉,我不喜欢断开的链接:)

在鼠标点的帮助下拖动身体,它将与世界上的其他身体碰撞并对其施加力

Box2d-手动-

8.10鼠标关节

鼠标关节在试验台中用于使用鼠标操纵身体。它试图将实体上的一个点推向光标的当前位置。对旋转没有限制

鼠标关节定义具有目标点、最大力、频率和阻尼比。目标点最初与主体的锚定点重合。当多个动态物体相互作用时,最大力用于防止剧烈反应。你想做多大就做多大。频率和阻尼比用于创建类似于距离关节的弹簧/阻尼效果

许多用户已经尝试将鼠标关节用于游戏。用户通常希望实现精确定位和即时响应。在这种情况下,鼠标关节不能很好地工作。你可能希望考虑使用运动体。< /P> 那么,让我们开始

  • 您必须创建物理世界以及其中至少一个实体。(签出物理示例如何…)
-鼠标点法

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);
}
 
-触摸身体

我们必须重写OnAreTouched方法,在触摸位置上创建鼠标点定位点

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;
}
-移动身体

我们在场景上移动手指,所以我们也必须移动鼠标点。 如果我们放开手指。。我们必须摧毁鼠标点

@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方法中)

我建议您看看教程示例。从中复制(抱歉,我不喜欢断开的链接:)

在鼠标点的帮助下拖动身体,它将与世界上的其他身体碰撞并对其施加力

Box2d-手动-

8.10鼠标关节

鼠标关节在试验台中用于使用鼠标操纵身体。它试图将实体上的一个点推向光标的当前位置。对旋转没有限制

鼠标关节定义具有目标点、最大力、频率和阻尼比。目标点最初与主体的锚定点重合。当多个动态物体相互作用时,最大力用于防止剧烈反应。你想做多大就做多大。频率和阻尼比用于创建类似于距离关节的弹簧/阻尼效果

许多用户已经尝试将鼠标关节用于游戏。用户通常希望实现精确定位和即时响应。在这种情况下,鼠标关节不能很好地工作。你可能希望考虑使用运动体。< /P> 那么,让我们开始

  • 您必须创建物理世界以及其中至少一个实体。(签出物理示例如何…)
-鼠标点法

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);
}
 
-触摸身体

我们必须重写OnAreTouched方法,在触摸位置上创建鼠标点定位点

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;
}
-移动身体

我们在场景上移动手指,所以我们也必须移动鼠标点。 如果我们放开手指。。我们必须摧毁鼠标点

@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方法中)