0

box2d ボディになり、CCSprite オブジェクトによってペイントされる線を描画する必要があります。今、私は非常に素晴らしい線を描くことができました(デバッグ描画中にのみ表示されます)が、描画中に使用してすべてのポイントの位置を取得できるかどうかはわかりません。コードが以下のようになっている場合、CCSprite 画像は、ユーザーが非常にゆっくり描画した場合にのみ表示されます。ユーザーがすばやく描画している場合、画像の点はほとんど見えません。SetAsEdge 関数からポイントを取得し、1 つの描画 CCSprite ごとにポイントを取得する必要があると思いますが、このポイントを取得する方法がわかりません。

            CGPoint start = [touch locationInView: [touch view]];
            start = [[CCDirector sharedDirector] convertToGL: start];
            CGPoint end = [touch previousLocationInView:[touch view]];
            end = [[CCDirector sharedDirector] convertToGL:end];
            float distance = ccpDistance(start, end);
            if (distance > 1)
            {
                int d = (int)distance;

                b2Vec2 s(start.x/PTM_RATIO, start.y/PTM_RATIO);
                b2Vec2 e(end.x/PTM_RATIO, end.y/PTM_RATIO);
                CCSprite *obj = [CCSprite spriteWithFile:@"image.png"];      
                b2BodyDef bd;
                bd.userData = obj;
                bd.type = b2_staticBody;
                bd.position.Set(0, 0);
                obj.position = ccp(start.x,start.y);
                [self addChild:obj z:1];

                b2Body* body = _world->CreateBody(&bd);
                b2PolygonShape shape;
                shape.SetAsEdge(b2Vec2(s.x, s.y), b2Vec2(e.x, e.y));
                body->CreateFixture(&shape, 0.0f);

            }
4

1 に答える 1

0

わかりました解決策を見つけました。おそらくこれは他の人にとって役立つでしょう。

        CGPoint start = [touch locationInView: [touch view]];
        start = [[CCDirector sharedDirector] convertToGL: start];
        CGPoint end = [touch previousLocationInView:[touch view]];
        end = [[CCDirector sharedDirector] convertToGL:end];
        float distance = ccpDistance(start, end);
        if (distance > 1)
        {
            int d = (int)distance;

            b2Vec2 s(start.x/PTM_RATIO, start.y/PTM_RATIO);
            b2Vec2 e(end.x/PTM_RATIO, end.y/PTM_RATIO);     
            b2BodyDef bd;            
            bd.type = b2_staticBody;
            bd.position.Set(0, 0);


            b2Body* body = _world->CreateBody(&bd);
            b2PolygonShape shape;
            shape.SetAsEdge(b2Vec2(s.x, s.y), b2Vec2(e.x, e.y));
            body->CreateFixture(&shape, 0.0f);

            CGPoint diff = ccpSub(start, end);
                float rads = atan2f( diff.y, diff.x);
                float degs = -CC_RADIANS_TO_DEGREES(rads);
                float dist = ccpDistance(end, start);
                CCSprite *obj = [CCSprite spriteWithFile:@"image.png"];
                [obj setAnchorPoint:ccp(0.0f, 0.5f)];
                [obj setPosition:end];
                [obj setScaleX:dist/obj.boundingBox.size.width];
                [obj setRotation: degs];
                [self addChild:obj];
       }
于 2012-08-21T12:29:41.607 に答える