【发布时间】:2012-02-02 08:27:51
【问题描述】:
我正在开发一款 Cocos2D 和 Box2D 游戏。我刚刚为游戏界面创建了一个类,以便玩家可以选择不同的控件类型。因为我在物理上使用 Box2D,似乎所有的类都必须是 .mm 而不是 .m - 但是当我在 HelloWorldLayer.h 中定义新的控制器对象时,我收到以下错误:
“ISO C++ 禁止无类型声明‘SparkController’”。 和 “预期的 ';'在 '*' 标记之前”。
我发现了几篇文章,其中人们遇到了类似的错误,但都是非常不同的情况。我觉得这是可能由许多不同问题引起的一般错误之一。
我的 SparkController 实例在 HelloWorldLayer.h 中的声明如下所示。这是弹出错误的地方:
SparkController *_controller;
所以它似乎试图将这一行解析为 C++ 代码? SparkController.h 和 SparkController.mm 类都完全用 Objective-C 编写,我什至没有在类中包含 Box2D,因为它不是必需的。为了查看 .mm 是否是问题所在,我尝试将 SparkController.mm 更改为 .m,编译器在放弃之前抛出了 200 个错误。所以我不知道我可能做错了什么。还有什么其他代码对我有用,可以帮助诊断问题?
编辑:感谢以下所有 cmets。不幸的是,您的建议都没有奏效。我包含了 SparkController.h 的头文件,也许它会帮助指出我做错了什么:
#import "cocos2d.h"
#import "HelloWorldLayer.h"
@interface SparkController : NSObject {
BOOL _drawPreviewLine;
CGPoint _touchStartLocation;
float _previewAngle;
float _sparkAngle;
CCParticleSystemQuad *_spark;
}
@property (nonatomic, assign) BOOL drawPreviewLine;
@property (nonatomic, assign) CGPoint touchStartLocation;
@property (nonatomic, assign) float previewAngle;
@property (nonatomic, assign) float sparkAngle;
@property (nonatomic, retain) CCLayer *layer;
//+(id)initWithLayer:(CCLayer *)layer;
@end
@interface GestureController : SparkController{
}
+(id)initWithLayer:(CCLayer *)layer;
-(void)touchBeganAt:(CGPoint)touchStartLocation;
-(void)touchMovedTo:(CGPoint)touchLocation;
-(void)touchEndedAt:(CGPoint)touchLocation;
@end
@interface HybridController : SparkController{
}
+(id)initWithLayer:(CCLayer *)layer;
@end
@interface TouchController : SparkController{
}
+(id)initWithLayer:(CCLayer *)layer;
@end
如果有帮助,这里是 HelloWorldLayer.h 的相关部分:
#import "cocos2d.h"
#import "Box2D.h"
#import "MyContactListener.h"
#import "GLES-Render.h"
#import "SparkController.h"
// HelloWorldLayer
@interface HelloWorldLayer : CCLayer
{
...
SparkController *_controller;
}
【问题讨论】:
-
HelloWorldLayer.h是否导入SparkController.h?另外,SparkController.h是否导入HelloWorldLayer.h? -
是的,是的。感谢您检查:-)
标签: objective-c ios xcode cocos2d-iphone