我有一个继承自CCSprite
被调用的类GameObject
。我还有一个ActionDispatcher
继承自NSObject
.
工作是在被询问时ActionDispatcher sharedActionDispatcher's
返回 a CCActionInterval
,并且执行此操作的方法需要对询问对象的引用,该对象是类型GameObject
(或其子类)。但是为了GameObject
能够要求这个,它需要参考ActionDispatcher
。所以我在标题中有一个#import "GameObject.h"
,在ActionDispatcher
标题#import "ActionDispatcher"
中有一个GameObject
。
我收到一个错误:Expected ')' before 'GameObject'
在ActionManager
引用 a 的方法中GameObject
。
编辑:添加评论以显示我根据下面接受的答案修复此问题的位置。
//The GameObject interface
#import "cocos2d.h"
#import "ActionDispatcher.h"
@interface GameObject : CCSprite {
CGPoint homeLocation;
}
@property (readwrite) CGPoint homeLocation;
- (void)updateStateWithDeltaTime:(ccTime)deltaTime
andListOfGameObjects:(CCArray*)listOfGameObjects;
@end
//The GameObject implementation
#import "GameObject.h"
@implementation GameObject
@synthesize homeLocation;
- (void)updateStateWithDeltaTime:(ccTime)deltaTime
andListOfGameObjects:(CCArray *)listOfGameObjects
{
//CCLOG(@"updateStateWithDeltaTime method should be overriden");
}
@end
//The ActionDispatcher interface
#import "cocos2d.h"
#import "CCRotateAround.h"
#import "Constants.h"
#import "GameObject.h" // Answer: Remove this line
// Add this here: @class GameObject;
@interface ActionDispatcher : NSObject {
}
+ (ActionDispatcher *)sharedActionDispatcher;
- (id)actionWithType:(ActionType)actionType
withObject:(GameObject *)gameObject
withDuration:(float)duration;
@end
//The ActionDispatcher implementation
#import "ActionDispatcher.h"
// and add this here: #import "GameObject.h"
@implementation ActionDispatcher
static ActionDispatcher* _sharedActionDispatcher = nil;
+ (ActionDispatcher*)sharedActionDispatcher
{
@synchronized([ActionDispatcher class])
{
if(!_sharedActionDispatcher)
[[self alloc] init];
return _sharedActionDispatcher;
}
return nil;
}
+ (id)alloc
{
@synchronized ([ActionDispatcher class])
{
NSAssert(_sharedActionDispatcher == nil,
@"Attempted to allocated a second instance of the ActionManager singleton");
_sharedActionDispatcher = [super alloc];
return _sharedActionDispatcher;
}
return nil;
}
- (id)actionWithType:(ActionType)actionType
withObject:(GameObject *)gameObject
withDuration:(float)duration
{
CGSize screenSize = [[CCDirector sharedDirector] winSize];
id action = nil;
switch (actionType) {
case kActionDiveBomb:
CCLOG(@"ActionManager returning action of type: dive bomb");
CGPoint controlPoint1 = ccp(gameObject.position.x, gameObject.position.y*0.5f);
CGPoint controlPoint2 = ccp(screenSize.width*0.5f, gameObject.position.y*0.5f);
CGPoint destination = ccp(screenSize.width*0.5f, -gameObject.contentSize.height*0.5f);
ccBezierConfig diveBombBezier;
diveBombBezier.controlPoint_1 = controlPoint1;
diveBombBezier.controlPoint_2 = controlPoint2;
diveBombBezier.endPosition = destination;
id diveAction = [CCBezierTo actionWithDuration:duration bezier:diveBombBezier];
id returnToTopAction = [CCMoveTo actionWithDuration:0.0f position:ccp(gameObject.homeLocation.x, screenSize.height+gameObject.contentSize.height/2)];
id fallInAction = [CCMoveTo actionWithDuration:duration*0.2 position:gameObject.homeLocation];
action = [CCSequence actions:diveAction, returnToTopAction, fallInAction, nil];
break;
case kActionLoop:
CCLOG(@"ActionManager returning action of type: loop");
CGPoint centerPoint = ccp(screenSize.width/2, screenSize.height/2);
float span = 360.0;
action = [CCRotateAround actionWithDuration:duration centerPoint:centerPoint spanAngle:span];
break;
case kActionSpin:
CCLOG(@"ActionManager returning action of type: spin");
action = [CCRotateBy actionWithDuration:duration angle:360.0f];
break;
case kActionGoHome:
CCLOG(@"ActionManager returning action of type: go home");
action = [CCMoveTo actionWithDuration:0.0f position:[gameObject homeLocation]];
break;
case kActionFallIn:
CCLOG(@"ActionManager returning action of type: fall in");
action = [CCMoveTo actionWithDuration:duration position:[gameObject homeLocation]];
break;
case kActionIdle:
CCLOG(@"ActionManager returning action of type: idle");
action = [CCDelayTime actionWithDuration:duration];
break;
default:
CCLOG(@"ActionManager returning action of type: no valid action");
break;
}
return action;
}
@end