Cocos2d iphone 在box2d中使用鼠标关节(无接触)将动态实体移动到目标位置

Cocos2d iphone 在box2d中使用鼠标关节(无接触)将动态实体移动到目标位置,cocos2d-iphone,box2d-iphone,Cocos2d Iphone,Box2d Iphone,我正在尝试使用鼠标关节将球(动态实体)移动到目标位置 我有一个射击按钮,当我点击它时,我调用这个方法来创建我的球 -(void) addNewSpriteAtPosition:(CGPoint)p withAngle:(CGFloat)angle { CCLOG(@"Add sprite %0.2f x %02.f",p.x,p.y); angle = 270-angle; sprite1 = [PhysicsSprite spriteWithTexture:sprit

我正在尝试使用鼠标关节将球(动态实体)移动到目标位置

我有一个射击按钮,当我点击它时,我调用这个方法来创建我的球

-(void) addNewSpriteAtPosition:(CGPoint)p withAngle:(CGFloat)angle
{
    CCLOG(@"Add sprite %0.2f x %02.f",p.x,p.y);

    angle = 270-angle;
    sprite1 = [PhysicsSprite spriteWithTexture:spriteTexture_ rect:CGRectMake(0 ,0 ,22,22)];                        
    [self addChild:sprite1 z:0 tag:1111];
    [spritesToRemoveArray addObject:sprite1];
    sprite1.rotation = angle;
    sprite1.position = ccp( p.x, p.y);

    // Define the dynamic body.
    //Set up a 1m squared box in the physics world

    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO-1.0);
    bodyDef.userData = sprite1;
    _footballBody = world->CreateBody(&bodyDef);
    _footballBody->SetUserData(sprite1);
    // Define another box shape for our dynamic body.
    b2CircleShape dynamicBox;
    dynamicBox.m_radius = 0.35f;
    //dynamicBox.(.5f, .5f);//These are mid points for our 1m box

    // Define the dynamic body fixture.
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &dynamicBox; 
    fixtureDef.density = 20.0f;
    fixtureDef.friction = 0.9f;
    fixtureDef.restitution = 0.6f;
    fixtureDef.userData = sprite1;
    fixtureDef.filter.groupIndex = -1;
    _footballFixture = _footballBody->CreateFixture(&fixtureDef);
    [sprite1 setPhysicsBody:_footballBody];



    float angle1 = CC_DEGREES_TO_RADIANS(angle);
    b2Vec2 vect = b2Vec2(cos(angle1)*120, sin(angle1)*120);
    b2Vec2 PointVector = _footballBody->GetPosition();
    _footballBody->ApplyLinearImpulse(vect,PointVector);


    b2Vec2 targetPos = b2Vec2(body1->GetPosition());
    //if (_footballFixture->TestPoint(_footballBody->GetPosition())) {
    NSLog(@"\n Target postion = <%f,%f>",targetPos.x,targetPos.y);
    NSLog(@"\n football position = <%f,%f>",_footballBody->GetPosition().x/32.0,_footballBody->GetPosition().y/32.0);

        b2MouseJointDef md;
        md.bodyA = _groundBody;
        md.bodyB = _footballBody;
        md.target = targetPos;
        md.collideConnected = true;
        md.maxForce = 1000.0f * _footballBody->GetMass();
//        md.dampingRatio = 0;
//        md.frequencyHz = 100;
        _mouseJoint = (b2MouseJoint *) world->CreateJoint(&md);
        _footballBody->SetAwake(true);
    //}




}
-(void)addNewSpriteAtPosition:(CGPoint)p with angle:(CGFloat)angle
{
CCLOG(@“添加雪碧%0.2f x%02.f”,p.x,p.y);
角度=270度;
sprite1=[physicsprite-spriteWithTexture:spriteTexture\urect:CGRectMake(0,0,22,22)];
[self addChild:sprite1 z:0标记:1111];
[spritesToRemoveArray addObject:sprite1];
sprite1.旋转=角度;
sprite1.position=ccp(p.x,p.y);
//定义动态实体。
//在物理学界设立一个1米见方的盒子
bodyDef.type=b2_dynamicBody;
车身定义位置设置(p.x/PTM_比率,p.y/PTM_比率-1.0);
bodyDef.userData=sprite1;
_footballBody=world->CreateBody(&bodyDef);
_足球身体->设置用户数据(sprite1);
//为我们的动态身体定义另一个长方体形状。
b2圆形动态盒;
dynamicBox.m_半径=0.35f;
//dynamicBox.(.5f,.5f);//这些是我们1m盒子的中点
//定义动态实体夹具。
b2FixtureDef fixtureDef;
fixtureDef.shape=&dynamicBox;
固定件密度=20.0f;
固定件摩擦力=0.9f;
fixtureDef.Restoration=0.6f;
fixtureDef.userData=sprite1;
fixtureDef.filter.groupIndex=-1;
_足球固定装置=_footballBody->CreateFixture(&fixtureDef);
[sprite1 setPhysicsBody:_footballBody];
浮动角度1=CC_度到_弧度(角度);
b2Vec2-vect=b2Vec2(cos(angle1)*120,sin(angle1)*120);
b2Vec2点向量=_footballBody->GetPosition();
_足球身体->应用线性脉冲(矢量,点矢量);
b2Vec2 targetPos=b2Vec2(body1->GetPosition());
//如果(_footballFixture->TestPoint(_footballBody->GetPosition()){
NSLog(@“\n Target position=”,targetPos.x,targetPos.y);
NSLog(@“\n football position=”,_footballBody->GetPosition().x/32.0,_footballBody->GetPosition().y/32.0);
b2MouseJointDef-md;
md.bodyA=_地面主体;
md.bodyB=_足球身体;
md.target=targetPos;
md.collide=true;
md.maxForce=1000.0f*_footballBody->GetMass();
//md.dampingRatio=0;
//md.frequencyHz=100;
_mouseJoint=(b2MouseJoint*)world->CreateJoint(&md);
_footballBody->SetAwake(正确);
//}
}
实际上,当我这样做的时候,球应该移动到目标点,但是在这里使用上面的方法,球在它创建的点上浮动,并且慢慢地移动到左边缘的第十八个右边缘

我需要你方的建议我如何解决这个问题

非常感谢任何人的帮助


谢谢大家,

我通过替换md.target=targetPos来实现这一点;md.target=b2Vec2(_footballBody->GetPosition());的代码行;。并在方法_mouseJoint->SetTarget(targetPos)的末尾添加行;我这里也有问题。因为我在球和目标位置之间有障碍物。当球碰到障碍物时,它会改变远离目标位置的方向。有什么帮助吗。。??