Ожидаемый список спецификаторов-квантификаторов перед ошибкой b2Body в XCode

Я пытаюсь получить класс от CCSprite для хранения ссылки спрайтов на соответствующий b2Body, но получаю следующие ошибки (комментарии в коде)

BoxSprite.h

#import <Foundation/Foundation.h>
#import "Box2D.h"
#import "cocos2d.h"

@interface BoxSprite : CCSprite {
    b2Body* bod; // Expected specifier-quantifier-list before b2Body
}

@property (nonatomic, retain) b2Body* bod; // Expected specifier-quantifier-list before b2Body

@end // Property 'bod' with 'retain' attribute must be of object type

BoxSprite.m

#import "BoxSprite.h"

@implementation BoxSprite

@synthesize bod; // No declaration of property 'bod' found in the interface

- (void) dealloc
{
    [bod release]; // 'bod' undeclared
    [super dealloc];
}

@end

Я надеялся создать спрайт и назначить тело с помощью:

BoxSprite *sprite = [BoxSprite spriteWithBatchNode:batch rect:CGRectMake(32 * idx,32 * idy,32,32)];
...
sprite->bod = body; // Instance variable 'bod' is declared protected

Затем получите доступ к b2Body:

if ([node isKindOfClass:[BoxSprite class]]) {
    BoxSprite *spr = (BoxSprite*)node;
    b2Body *body = spr->bod; // Instance variable 'bod' is declared protected
    ...
}

person Zeophlite    schedule 29.12.2010    source источник
comment
Не удается найти определение класса b2Body, где оно определено?   -  person ismail    schedule 29.12.2010


Ответы (2)


Вместо

@property (nonatomic, retain) b2Body* bod;

использовать

@property (assign) b2Body *bod;

так как вы не передаете объект target-c. Директива @synthesize также будет работать, поэтому вам не нужно создавать свои собственные методы получения и установки, если вы не хотите одновременно делать что-то еще.

person arrtchiu    schedule 31.12.2010

b2Body — это объект C++, поэтому мне приходится создавать свои собственные геттеры и сеттеры и переименовывать BoxSprite.m в файл .mm.

BoxSprite.h

#import <Foundation/Foundation.h>
#import "Box2D.h"
#import "cocos2d.h"

@interface BoxSprite : CCSprite {
    b2Body* bod;
}

-(b2Body*) getBod;
-(void) setBod:(b2Body *)b;

@end

BoxSprite.мм

#import "BoxSprite.h"

@implementation BoxSprite

-(b2Body*) getBod {
    return bod;
}

-(void) setBod:(b2Body *)b {
    bod = b;
}

@end

Создавать:

BoxSprite *sprite = [BoxSprite spriteWithBatchNode:batch rect:CGRectMake(32 * idx,32 * idy,32,32)];
...
[sprite setBod:body];

Доступ:

if ([node isKindOfClass:[BoxSprite class]]) {
    BoxSprite *spr = (BoxSprite*)node;
    b2Body *body = [spr getBod];
    ...
}
person Zeophlite    schedule 30.12.2010