0

このメソッドを使用してスプライトを初期化します。

-(id)initAttackerWithType:(ShapeType)type withPosition:(CGPoint)pos world:(b2World*)world andEnergy:(float)energy {
    if(([self initWithTexture:[[CCTextureCache sharedTextureCache]addImage:@"circle.png"]])){
        self.tag=type;
        self.color= type == Enemy ? ccc3(255, 0, 0) : ccc3(0, 255, 0);

        self.scale=energy *.22/PTM_RATIO; //scale depending on energy
                                       // 0.22 gets the sprite scale to synchronize with shape radius  
        self.position=pos;

        b2BodyDef bodyDef;
        bodyDef.type = b2_dynamicBody;
        bodyDef.position.Set(pos.x/PTM_RATIO, pos.y/PTM_RATIO);
        _body = world->CreateBody(&bodyDef);

        b2CircleShape dynamicCircle;
        dynamicCircle.m_radius=energy/PTM_RATIO;  //radius depending on energy 

        b2FixtureDef fixtureDef;
        fixtureDef.shape = &dynamicCircle;
        fixtureDef.density = 1.0f;
        fixtureDef.friction = 0;
        fixtureDef.restitution = 1;
        _body->CreateFixture(&fixtureDef);
        fixtureDef.userData=self;
        _body->SetUserData(self);



    }else self = nil;
    return self ? self : nil;
}

力学、衝突に関するすべてがうまく機能します。唯一の問題は、エネルギーに応じてスプライトのスケールが変化しないことです。誤解しないでください。画面に追加されているはずですが、スケール 1 でのみです。

スケールをログに記録すると、本来あるべきスケールでログが記録されますが、実際の画像はそうではありません。

見落としていたシンプルで簡単なものがあると確信していますが、何がわかりません。

4

1 に答える 1

0

CCPhysicsSprite を使用していると思いますか? 次に、nodeToParentTransform コードをチェックし、x/y 座標が scaleX/Y で乗算されているかどうかを確認します。以前のバージョンではスケールを使用していなかったと思いますが、少なくともコメントはこれを示しているようです。参考までに、バージョンの変換コードを比較して更新できるように、v2.1 rc1 のメソッドを投稿します。

-(CGAffineTransform) nodeToParentTransform
{
    // Although scale is not used by physics engines, it is calculated in case
    // the sprite is animated (scaled up/down) using actions.
    // For more info see: http://www.cocos2d-iphone.org/forum/topic/68990
    cpVect rot = (_ignoreBodyRotation ? 
                  cpvforangle(-CC_DEGREES_TO_RADIANS(_rotationX)) : 
                  _cpBody->rot);
    CGFloat x = _cpBody->p.x + rot.x * -_anchorPointInPoints.x * _scaleX - 
                rot.y * -_anchorPointInPoints.y * _scaleY;
    CGFloat y = _cpBody->p.y + rot.y * -_anchorPointInPoints.x * _scaleX + 
                rot.x * -_anchorPointInPoints.y * _scaleY;

    if (_ignoreAnchorPointForPosition)
    {
        x += _anchorPointInPoints.x;
        y += _anchorPointInPoints.y;
    }

    return _transform = CGAffineTransformMake(rot.x * _scaleX, rot.y * _scaleX,
                                              -rot.y * _scaleY, rot.x * _scaleY,
                                              x,   y);
}
于 2013-05-26T19:24:05.670 に答える