【问题标题】:How to collide the fixtures when askew or slope?倾斜或倾斜时如何碰撞固定装置?
【发布时间】:2013-12-26 11:26:58
【问题描述】:

当我commnet两行代码时,我想碰撞球并阻挡但无法碰撞球和阻挡,但如果我取消注释两行代码,则显示水平不歪斜或倾斜的块。

请检查我的 coe:

    for(int i = 0; i < 4; i++) {



        static int padding=20;


        self.touchEnabled = YES;

        // Create block and add it to the layer
        CCSprite *block = [CCSprite spriteWithFile:@"block.png"];
        int xOffset = padding+block.contentSize.width/2 +  ((block.contentSize.width+padding)*i);
        block.position = ccp(xOffset, 250);
        block.tag = 2;
        [self addChild:block];

        // Create block body
        b2BodyDef blockBodyDef;
        blockBodyDef.type = b2_dynamicBody;   //b2_dynamicBody  ,b2_staticBody
        blockBodyDef.position.Set(xOffset/PTM_RATIO, 250/PTM_RATIO);
        blockBodyDef.userData = block;
        b2Body *blockBody = _world->CreateBody(&blockBodyDef);



        // Create block shape

// 这两行会产生问题如果我取消阻塞两行代码工作正常但所有 4 块仅在一行上显示水平但球可以击中块。我想让球击中方块,方块会水平显示。

     //   b2PolygonShape blockShape;
    //    blockShape.SetAsBox(block.contentSize.width/PTM_RATIO/2,      block.contentSize.height/PTM_RATIO/2);




      //////////////////////////////  If I comment the these lines and uncomment above two line the block will show horizontally and ball can hit the block. But I want this code to show my block slope like. This is must. I want block will show slope and ball can hit the block.

        b2PolygonShape blockShape;
        int num = 3;
        b2Vec2 verts[] = {
            b2Vec2(27.5f / PTM_RATIO, 296.6f / PTM_RATIO),
            b2Vec2(14.3f / PTM_RATIO, 127.2f / PTM_RATIO),
            b2Vec2(187.0f / PTM_RATIO, 288.4f / PTM_RATIO),
            b2Vec2(400.0f / PTM_RATIO, 288.4f / PTM_RATIO)
        };
        blockShape.Set(verts, num);
    ///////////////////////////////////////////////////////////////////







        // Create shape definition and add to body
        b2FixtureDef blockShapeDef;
        blockShapeDef.shape = &blockShape;
        blockShapeDef.density = 10.0;
        blockShapeDef.friction = 0.0;
        blockShapeDef.restitution = 0.1f;
        blockBodyDef.angle = 45/PTM_RATIO;
         //blockShapeDef.angle = angle * 4.1;
        //blockShapeDef->angle = angle * 0.0174533f;
        //blockBody->SetTransform(b2Vec2(2, 45));
        //blockBodyDef->angle = Math.PI / 180 * 30;//30°
        //float32 angle2 = blockBody->GetAngle();
        blockBody->CreateFixture(&blockShapeDef);









    }

非常欢迎任何想法或建议。

【问题讨论】:

    标签: iphone objective-c cocoa-touch cocos2d-iphone box2d


    【解决方案1】:

    我不确定您的确切问题是什么,但我确实发现您的代码存在一些问题:

    1. 您设置的身体角度不正确。你需要用弧度来做,而不是度数。而且你需要在body transform上设置它:

      // 我不相信这行得通... //blockBodyDef.angle = CC_DEGREES_TO_RADIANS(45);

      ...

      //float32 angle2 = blockBody->GetAngle(); blockBody->CreateFixture(&blockShapeDef); // 我的修改线 blockBody->SetTransform(blockBody->GetPosition(), CC_DEGREES_TO_RADIANS(40));

    2. 我使用了你的 SetAsBox(...) 方法,但考虑了精灵的比例因子:

      block.scale = 0.25f; // 我添加了这个用于测试

      b2PolygonShape 方块形状; blockShape.SetAsBox(block.scale*block.contentSize.width/PTM_RATIO/2, block.scale*block.contentSize.height/PTM_RATIO/2);

    当我完成所有这些操作时,我得到了四个盒子,它们从屏幕中间开始(旋转 40 度),然后掉到地上并滚平。这是你想要做的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2019-12-15
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2013-06-21
      相关资源
      最近更新 更多