我正在制作Cocos2D和Box2D游戏。我刚刚为游戏界面创建了一个类,因此玩家可以选择不同的控件类型。因为我在物理上使用Box2D似乎所有的类都必须是.mm而不是.m - 但是当我在HelloWorldLayer.h中定义新的控制器对象时,我得到以下错误:
“ISO C ++禁止声明'SparkController'没有类型”。 和 “预期';'在'*'标记之前。
我发现了一些文章,其中人们遇到了类似的错误,但情况都非常不同。我明白这是可能由许多不同问题引起的一般错误之一。
我在HelloWorldLayer.h中的SparkController实例的声明如下所示。这是错误弹出的地方:
SparkController *_controller;
所以看起来它试图将这一行解析为C ++代码? 类SparkController.h和SparkController.mm都完全用Objective-C编写,我甚至不包括类中的Box2D,因为它不需要。要查看.mm是否是问题,我尝试将SparkController.mm更改为.m,编译器在放弃之前抛出了200个错误。所以我不知道我可能做错了什么。还有什么其他代码可以在这里发布以帮助诊断问题?
编辑:感谢下面的所有评论。不幸的是,你的建议都没有用。我包含了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;
}
答案 0 :(得分:2)
它告诉你它无法识别SparkController
。似乎错误可能来自上面的行,或者你可能需要在HelloWorldLayer.h顶部的class SparkController;
。
编辑:您的问题是您在HelloWorldLayer中的SparkController和SparkController.h中导入HelloWorldLayer.h。这不行。您应该在实现(.m)文件中导入它们,并在.h文件中转发声明类。
HelloWorldLayer.h:
@class SparkController;
HelloWorldLayer.m:
#import "SparkController.h"
SparkController.h:
@class HelloWorldLayer;
SparkController.m:
#import "HelloWorldLayer.h"
答案 1 :(得分:1)
如果您使用.mm
文件扩展名,Xcode会假定您的代码是Objective-C ++,因此是C ++错误消息。
关于错误消息本身,编译器抱怨它对SparkController
一无所知,即在解析你给出的代码行之前没有看到类型声明。也许你忘了包含正确的头文件。
答案 2 :(得分:0)
检查HelloWorldLayer文件中是否存在@class
和#import
。