所以我正在开发一个跨平台的视频游戏...因此,我需要能够在Windows平台上使用DirectX,在Mac,Linux和Android平台上使用OpenGL / ES,在iOS上使用Metal平台。我搜索了库但找不到任何东西,所以,我决定创建自己的typedef,它将被宏控制,例如,我在Windows平台上定义COLOR为D3DColor,UIColor在iPhone平台上,以及其他GL兼容平台上的glColor4f。这是iOS平台的函数所在的头文件(CommonMetal.h):
#ifndef CommonMetal_h
#define CommonMetal_h
#if defined Metal
typedef UIColor* COLOR;
typedef GLKVector3 VECTOR3;
typedef GLKVector4 VECTOR4;
COLOR NEWCOLOR(float r, float g, float b, float a);
VECTOR3 NEWVECTOR3(float x, float y, float z);
VECTOR4 NEWVECTOR4(float x, float y, float z, float w);
VECTOR3 VECTOR3CrossProduct(VECTOR3 first, VECTOR3 second);
VECTOR4 VECTOR4CrossProduct(VECTOR4 first, VECTOR4 second);
float VECTOR3DotProduct(VECTOR3 first, VECTOR3 second);
float VECTOR4DotProduct(VECTOR4 first, VECTOR4 second);
VECTOR3 VECTOR3Normalize(VECTOR3 vector);
VECTOR4 VECTOR4Normalize(VECTOR4 vector);
float VECTOR3Length(VECTOR3 vector);
float VECTOR4Length(VECTOR4 vector);
VECTOR3 VECTOR3Lerp(VECTOR3 start, VECTOR3 end, float t);
VECTOR4 VECTOR4Lerp(VECTOR4 start, VECTOR4 end, float t);
#endif
#endif
这是obj-c源文件(CommonMetal.m)中的代码:
#import <Foundation/Foundation.h>
#import "CommonMetal.h"
#if defined Metal
COLOR NEWCOLOR(float r, float g, float b, float a)
{
return [UIColor colorWithRed:r green:g blue:b alpha:a];
}
VECTOR3 NEWVECTOR3(float x, float y, float z)
{
return GLKVector3Make(x, y, z);
}
VECTOR4 NEWVECTOR4(float x, float y, float z, float w)
{
return GLKVector4Make(x, y, z, w);
}
VECTOR3 VECTOR3CrossProduct(VECTOR3 first, VECTOR3 second)
{
return GLKVector3CrossProduct(first, second);
}
VECTOR4 VECTOR4CrossProduct(VECTOR4 first, VECTOR4 second)
{
return GLKVector4CrossProduct(first, second);
}
float VECTOR3DotProduct(VECTOR3 first, VECTOR3 second)
{
return GLKVector3DotProduct(first, second);
}
float VECTOR4DotProduct(VECTOR4 first, VECTOR4 second)
{
return GLKVector4DotProduct(first, second);
}
VECTOR3 VECTOR3Normalize(VECTOR3 vector)
{
return GLKVector3Normalize(vector);
}
VECTOR4 VECTOR4Normalize(VECTOR4 vector)
{
return GLKVector4Normalize(vector);
}
float VECTOR3Length(VECTOR3 vector)
{
return GLKVector3Length(vector);
}
float VECTOR4Length(VECTOR4 vector)
{
return GLKVector4Length(vector);
}
VECTOR3 VECTOR3Lerp(VECTOR3 start, VECTOR3 end, float t)
{
return GLKVector3Lerp(start, end, t);
}
VECTOR4 VECTOR4Lerp(VECTOR4 start, VECTOR4 end, float t)
{
return GLKVector4Lerp(start, end, t);
}
#endif
注意:Metal是我创建的预定义宏,用于确保这是一个符合金属的平台,并且代码已放置在预编译头中。
当我尝试编译项目时,我收到一个错误,指向typedef行的头文件。这是确切的错误:
... / CommonMetal.h:13:9:未知的类型名称&#39; UIColor&#39;
... / CommonMetal.h:14:9:未知的类型名称&#39; GLKVector3&#39;
... / CommonMetal.h:15:9:未知的类型名称&#39; GLKVector4&#39;
我已经阅读了有关堆栈溢出的其他答案,但每当我尝试添加:
#import <UIKit/UIKit.h>
正如此question/answer中所述的错误显示。因此,据我所知,该文件被认为是一个c ++文件而不是一个obj-c文件。我尝试使用上面链接中建议的答案,这确实消除了错误,但是UIColor之前没有定义的错误等仍然存在。如果需要任何其他信息,请添加评论,我一定会添加额外的信息。提前谢谢。
答案 0 :(得分:0)
事实证明问题是我在c ++文件(Engine.cpp)中导入标题(CommonMetal.h),所以我转到属性部分并选择了c ++文件并将其属性从c ++更改为目标c ++。这导致一切按预期运行。我希望这有助于任何人面对这个类似的问题。