将CCPhysicsSprite添加到CCLayer cocos2d

时间:2013-08-07 11:25:18

标签: objective-c cocos2d-iphone

我正在尝试在cocos2d中重新组织HelloWorld项目以满足我们的需求。 我做的事情 - 创建了一个类,这是CCPhysicsSprite固有的,并希望将其添加到CCLayerHelloWorldLayer)。但出了点问题。根据调试器我的实例已创建,但我无法在iOS模拟器中看到它。需要你的帮助和解释。

HelloWorldLayer.h

@interface HelloWorldLayer : CCLayer <GKAchievementViewControllerDelegate,     GKLeaderboardViewControllerDelegate>
{
    CCTexture2D *spriteTexture_;    // weak ref
    b2World* world_;                    // strong ref
    GLESDebugDraw *m_debugDraw;     // strong ref
}

HelloWorldLayer.mm(仅由我的函数更改:)

-(id) init
{
    if( (self=[super init])) {

        // enable events

        self.touchEnabled = YES;
        self.accelerometerEnabled = YES;
        CGSize s = [CCDirector sharedDirector].winSize;

        // init physics
        [self initPhysics];

        // create reset button
        //[self createMenu];

        //Set up sprite

//#if 1
//      // Use batch node. Faster
//      CCSpriteBatchNode *parent = [CCSpriteBatchNode batchNodeWithFile:@"blocks.png" capacity:100];
//      spriteTexture_ = [parent texture];
//#else
//      // doesn't use batch node. Slower
//      spriteTexture_ = [[CCTextureCache sharedTextureCache] addImage:@"blocks.png"];
//      CCNode *parent = [CCNode node];
//#endif
//      [self addChild:parent z:0 tag:kTagParentNode];
//      
//      
//      [self addNewSpriteAtPosition:ccp(s.width/2, s.height/2)];

        CCLabelTTF *label = [CCLabelTTF labelWithString:@"Tap screen" fontName:@"Marker Felt" fontSize:32];
        [self addChild:label z:0];
        [label setColor:ccc3(0,0,255)];
        label.position = ccp( s.width/2, s.height-50);

        [self scheduleUpdate];
    }
    return self;
}


-(void) addNewSpriteAtPosition:(CGPoint)p
{
    CCLOG(@"Add sprite %0.2f x %02.f",p.x,p.y);
    if([self getChildByTag:kTagParentNode] == nil)
    {
        BloodRobotUnit *unit = [[BloodRobotUnit alloc] initWithOwner:world_ at:p];
        [self addChild:unit z:0 tag:kTagParentNode];
    }
}

创建单位:(标题和mm文件:)

@interface BloodRobotUnit : CCPhysicsSprite
{

    b2Body *body_;
    b2World *owner_;
}

-(id) initWithOwner:(b2World*)owner at:(CGPoint)pt;

毫米:

-(id) initWithOwner:(b2World*)owner at:(CGPoint)pt
{
    if(self = [super initWithFile:@"blocks.png" rect:CGRectMake(0, 0, 32, 32)])
    {
        owner_ = owner;
        //create body at position
        b2BodyDef bodyDef;
        bodyDef.type = b2_dynamicBody;
        bodyDef.position.Set(pt.x/PTM_RATIO, pt.y/PTM_RATIO);
        body_ = owner->CreateBody(&bodyDef);

        // Define another box shape for our dynamic body.
        b2PolygonShape dynamicBox;
        dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box

        // Define the dynamic body fixture.
        b2FixtureDef fixtureDef;
        fixtureDef.shape = &dynamicBox;
        fixtureDef.density = 1.0f;
        fixtureDef.friction = 0.3f;
        body_->CreateFixture(&fixtureDef);

        [self setB2Body: body_];
        [self setPosition:pt];
        return (self);

    }
return nil;
}

我的错误在哪里?任何帮助将非常感激

1 个答案:

答案 0 :(得分:1)

诀窍在于为自己设定位置 调试器显示我的纹理位于inf:inf

使一切正常工作的代码更改如下:

在创建CCPhysicsSprite iheriter的mm文件中执行以下操作:

[self setB2Body: body_];
self.PTMRatio = PTM_RATIO;
//[self setPosition:CGPointMake(pt.x/PTM_RATIO, pt.y/PTM_RATIO)];

那就是 - 你只需要设置身体位置并设置PTMRatio(thanx到@giorashc)。不需要设置精灵纹理。