0

これはかなり簡単に聞こえるかもしれません。自分自身を返すクラス(Sprites.mm)にPhysicsSpritesを配列に入力しました(これはinitメソッドHelloWorldLayer.mmクラスで初期化します)。HelloWorldLayer.mmの更新メソッドで(Sprites.mmから)配列にアクセスするにはどうすればよいですか?updateメソッドのスプライトにいくつかの制限を設けたいと思います。助けてください。

4

2 に答える 2

1

まず、両方のクラスで同じb2Worldを共有する必要があります。次に、Sprites.mmワールドにアクセスできます。

理解を深めるために、動作するデモを作成しました。Spritese.h&Spritese.mmと呼んだSprites.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のinitメソッドにこのコードを追加します

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");
                }
            }
        }   
    }
}

コード例があなたの側で機能することを願っています。

于 2012-06-05T12:55:44.350 に答える
0

Sprites.hファイルにプロパティを作成します

@property (nonatomic, readonly) NSArray* physicSprites;

次に、.mmファイルで

@synthesize physicSprites = m_physicSprites;

配列インスタンスがm_physicSpritesと呼ばれる場合。

そうすれば、次のようにアクセスできるようになります。

[spritesInstance physicSprites];

また

spriteInstance.physicSprites
于 2012-06-05T12:21:52.960 に答える