0

だから私はクロスプラットフォームのビデオゲームに取り組んでいます... したがって、Windows プラットフォームでは DirectX、Mac、Linux、Android プラットフォームでは OpenGL/ES、iOS プラットフォームでは Metal を使用できる必要があります。ライブラリを検索しましたが、何も見つかりませんでした。そのため、たとえば COLOR を Windows プラットフォームでは D3DColor に、iPhone プラットフォームでは UIColor に定義するように、マクロ制御される独自の typedef を作成することにしました。 、および他の 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 は、これが Metal 準拠のプラットフォームであり、コードがプリコンパイル済みヘッダーに配置されていることを確認するために作成した定義済みマクロです。

プロジェクトをコンパイルしようとすると、ヘッダー ファイルの typedef 行を指すエラーが発生します。これは正確なエラーです:

.../CommonMetal.h:13:9: 不明な型名 'UIColor'

.../CommonMetal.h:14:9: 不明な型名 'GLKVector3'

.../CommonMetal.h:15:9: 不明な型名 'GLKVector4'

スタックオーバーフローに関する他の回答を読みましたが、追加しようとするたびに:

#import <UIKit/UIKit.h>

この質問/回答で説明されているエラーが表示されます。したがって、私が理解したことから、ファイルは obj-c ファイルではなく c++ ファイルであると考えられています。上記のリンクで提案されている回答を使用してみましたが、エラーは削除されましたが、UIColor が定義されていないなどの以前のエラーはまだ残っています。他の情報が必要な場合は、コメントを追加してください。その追加情報を確実に追加します。前もって感謝します。

4

1 に答える 1

0

問題は、ヘッダー (CommonMetal.h) を C++ ファイル (Engine.cpp) にインポートしていたことが判明したため、属性セクションに移動して C++ ファイルを選択し、その属性を c++ から Objective-c++ に変更しました。 . これにより、すべてが期待どおりに実行されました。これが、この同様の問題に直面しているすべての人に役立つことを願っています。

于 2015-01-25T23:24:44.480 に答える