2012-06-05 2 views
0

Это может показаться довольно простым. Я заполнил массив PhysicsSprites в классе (Sprites.mm), который возвращает себя (который я инициализирую в методе init метода HelloWorldLayer.mm). Как получить доступ к массиву (из Sprites.mm) в методе обновления HelloWorldLayer.mm? Я хочу поместить некоторые ограничения на спрайты в методе обновления. Пожалуйста помоги.Доступ к массиву из одного класса в другой - cocos2d

ответ

1

Прежде всего, вы должны одни и те же b2World в обоих классах, а затем вы можете получить доступ к мир Sprites.mm.

Для лучшего понимания я создал демоверсию, которая будет работать. Я добавляю код кода Sprites.mm, который я назвал, как Spritese.h & Spritese.mm

Ниже приведен код Spritese.h

@interface Spritese : CCLayer { 
     NSMutableArray *arrSprite; 
     b2World* world; 
    } 
    @property (nonatomic,retain) NSMutableArray *arrSprite; 
    -(id)initWithArrayOfSprites : (b2World *)_world; 
    @end 

показано ниже для .mm

@implementation Spritese 
    @synthesize arrSprite; 

    #define PTM_RATIO 32 
    #define kTagBatchNode 1 

    -(id)initWithArrayOfSprites :(b2World *)_world{ 
     if((self = [super init])){ 
     CGSize screenSize = [CCDirector sharedDirector].winSize; 
    world = _world; 

    //Set up sprite 

    CCSpriteBatchNode *batch = [CCSpriteBatchNode batchNodeWithFile:@"blocks.png" capacity:150]; 
    [self addChild:batch z:0 tag:kTagBatchNode]; 

    for(int i=0; i<3; i++)//creating 3 objects 
      [self addNewSpriteWithCoords:ccp(screenSize.width/2, screenSize.height/2)]; 

    } 
    return self; 
} 
-(void) addNewSpriteWithCoords:(CGPoint)p 
{ 
    CCLOG(@"Add sprite %0.2f x %02.f",p.x,p.y); 
    CCSpriteBatchNode *batch = (CCSpriteBatchNode*) [self getChildByTag:kTagBatchNode]; 

    //We have a 64x64 sprite sheet with 4 different 32x32 images. The following code is 
    //just randomly picking one of the images 
    int idx = (CCRANDOM_0_1() > .5 ? 0:1); 
    int idy = (CCRANDOM_0_1() > .5 ? 0:1); 
    CCSprite *sprite = [CCSprite spriteWithBatchNode:batch rect:CGRectMake(32 * idx,32 * idy,32,32)]; 
    [batch addChild:sprite]; 

    sprite.position = ccp(p.x, p.y); 

    // Define the dynamic body. 
    //Set up a 1m squared box in the physics world 
    b2BodyDef bodyDef; 
    bodyDef.type = b2_dynamicBody; 

    bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO); 
    bodyDef.userData = sprite; 
    b2Body *body = world->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); 

    [arrSprite addObject:sprite]; 
} 


@end 

В файле HelloWorld.h импортировать класс Spritese и добавить

@property(nonatomic,retain) Spritese *sprit; 

и синтезировать его в .mm файле

Теперь в методе инициализации в HelloWorld добавить этот код

sprit = [[Spritese alloc] initWithArrayOfSprites:world]; 
[self addChild:sprit]; 

И, наконец, в клеща или обновления метода необходимо добавить

-(void) tick: (ccTime) dt 
{ 

    int32 velocityIterations = 8; 
    int32 positionIterations = 1; 
    world->Step(dt, velocityIterations, positionIterations); 

    for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) 
    { 
     if (b->GetUserData() != NULL) { 
      CCSprite *myActor = (CCSprite*)b->GetUserData(); 

      myActor.position = CGPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO); 
      myActor.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()); 

      Spritese *s = (Spritese *)b->GetUserData(); 
      for(int i=0; i < [sprit.arrSprite count]; i++){ 
       if(s == [sprit.arrSprite objectAtIndex:i]){ 
        s.position = CGPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO); 
        s.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()); 
        NSLog(@"Process Sprite Here"); 
       } 
      } 
     } 
    } 
} 

I надеюсь, что пример кода будет работать на вашей стороне.

+0

Угадайте, это сработало, но у меня проблема, которая, как мне кажется, связана с методом обновления. На данный момент я хочу наложить гравитацию (выше мира) на спрайтов в «arrSprite», но они все еще отвечают мировой гравитации. См. Метод обновления ниже. '- (void) update: (ccTime) dt { \t \t int32 velocityIterations = 8; \t int32 positionIterations = 1; \t world-> Step (dt, velocityIterations, positionIterations); \t для (PhysicsSprite * spr in sprit.arrSprite) { b2Body * bBody = [spr getPhysicsBody]; bBody-> ApplyForce (b2Vec2 (0,20 * bBody-> GetMass()), bBody-> GetWorldCenter()); } } ' – wilM

+0

Извините abt форматирование кода – wilM

+0

Как вы делитесь одним и тем же миром в обоих слоях. Вы не сможете отличить оба мира. Я предполагаю, что любой слой не может иметь более одного мира. – Marine

0

создать свойство в файле sprites.h

@property (nonatomic, readonly) NSArray* physicSprites; 

затем в файле .mm

@synthesize physicSprites = m_physicSprites; 

, если ваш экземпляр массива называется m_physicSprites;

тогда вы будете иметь возможность получить доступ к нему чего-л, как

[spritesInstance physicSprites]; 

или

spriteInstance.physicSprites 
+0

спасибо. см. комментарий в ответе ниже – wilM

Смежные вопросы