cocos2d-xで文字列によって生成するオブジェクトのクラスを決定する
cocos2d-objCで書いたtiledMapを使ったゲームを、cocos2d-x(v3.7.1)で書き直しています。
objC版では、Tiledのオブジェクトグループからプロパティを読み込んで、
そのnameプロパティによって、ゲームに追加するキャラクター等オブジェクトのクラスを決定していました。
例えば、nameプロパティには"Player"や"Serpent"(敵キャラ)が設定されており、
NSClassFromStringでPlayerクラスやSerpentクラスのクラスオブジェクトを取得して、
オブジェクトを生成しています。
RRGLevel.m
for (NSDictionary* property in tiledMap.objectGroup.objects) {
NSString* name = property[@"name"];
RRGCharacter* character = [RRGCharacter levelObjectWithName:name level:self];
[character setAttributesWithProperties:property];
int x = [property[@"x"] intValue];
int y = [property[@"y"] intValue];
CGPoint tileCoord = [tiledMap tileCoordForTilePoint:ccp(x,y)];
[self addCharacter:character atTileCoord:tileCoord];
}
RRGLevelObject.m (RRGCharacterの親クラス)
+(instancetype)levelObjectWithName:(NSString *)name
level:(RRGLevel *)level
{
Class class = NSClassFromString(name);
RRGLevelObject* obj = [class levelObjectWithLevel:level];
NSAssert(obj != nil, @"Invalid name : %@", name);
return obj;
}
しかしcocos2d-xではNSClassFromStringのような関数がないので、
同様のことをやろうとすると、数十個のクラスについて場合分けを書かねばならず、
また、クラスが追加された時に、いちいち場合分け文を追加しなければなりません。
cocos2d-xで、Tiledのプロパティに設定したnameから、対応したクラスのオブジェクトを生成する効率的な方法がありましたら教えてください。