Программировал приложение для iOS / target-c / cocos2d.До этого препятствия все шло хорошо ... Должен заметить, что это Objective-C ++, т.е..mm файлы, компилируемые для симулятора iOS 5.0.
По сути, я только пытаюсь разделить интерфейс на подклассы.Ошибка выдается в строке @interface: « Не удается найти объявление интерфейса для GameObject »
#import <Foundation/Foundation.h>
#import "CCSprite.h"
#import "cocos2d.h"
#import "Box2D.h"
#import "GameObject.h"
@interface AvalancheBlock : GameObject
{
}
@end
Вот код для GameObject.h:
#import <UIKit/UIKit.h>
#import "cocos2d.h"
#import "Box2D.h"
#import "b2Body.h"
#import "OhSnowGame.h"
@interface GameObject : CCNode {
@public
b2Body *body;
b2BodyDef *bodyDef;
b2FixtureDef *fixtureDef;
b2PolygonShape *polygonShape;
b2CircleShape *circleShape;
CCSprite *sprite;
int typeTag;
bool markedForDestruction;
}
@property (readwrite, assign) b2Body *body;
@property (nonatomic, assign) b2BodyDef *bodyDef;
@property (nonatomic, assign) b2FixtureDef *fixtureDef;
@property (nonatomic, assign) b2PolygonShape *polygonShape;
@property (nonatomic, assign) b2CircleShape *circleShape;
@property (nonatomic, retain) CCSprite *sprite;
@property (readwrite, assign) int typeTag;
@property (readwrite, assign) bool markedForDestruction;
@property (readonly) int type;
-(id) init;
-(void) initBox2D;
-(int) type;
@end
И GameObject.mm:
#import "GameObject.h"
@implementation GameObject
@synthesize body, bodyDef, fixtureDef, polygonShape, circleShape, sprite, type, typeTag, markedForDestruction;
-(id) init {
if( (self=[super init]) ) {
[self initBox2D];
markedForDestruction = NO;
}
return self;
}
-(void) initBox2D {
bodyDef = new b2BodyDef();
fixtureDef = new b2FixtureDef();
//Initial fixture settings
fixtureDef->density = 1.0f;
fixtureDef->friction = 0.5f;
fixtureDef->restitution = 0.3f;
bodyDef->userData = self;
}
-(int) type {
return 0;
}
@end
Если включен правильный файл ... тогда почему ошибка?Спасибо!
решено: разобрался ... там была круговая ссылка, но ссылка мне все же нужна.Решением было удалить #import "OhSnowGame.h" из GameObject.h и вместо этого добавить директиву: @class OhSnowGame
Узнавать что-то новое каждый день.
ВТОРОЕ ОБНОВЛЕНИЕ: Новый вопрос, но очень связанный.У меня есть OhSnowGame.mm, который включает в себя «AvalancheGrid.h».AvalancheGrid.h включает в себя AvalancheParams.h.В OhSnowGame я ссылаюсь как на AvalancheGrid, так и на AvalancheParams.
Компилятор выдает ошибку компоновщика: «Дублирующий символ AvalancheParams в OhSnowGame.o и AvalancheGrid.o»
Но на самом деле это не так 'Кажется, что есть какая-то круговая ссылка на меня.Если я заменим #import "AvalancheGrid.h" в OhSnowGame.mm на просто @class AvalancheGrid;(а также @class AvalancheParams.h;) тогда он не позволяет мне ссылаться на свойства тех объектов, которые мне нужны, например:
avParams.severity = 3; //nope
avParams->severity = 3; //nope
[avParams setSeverity:3]; //nope (with @property severity exposed and synthesized)
Я не понимаю.Как я могу избежать ошибки компоновщика и при этом получить доступ к этим свойствам?