1

私のアプリケーションでは、あるイベントに基づいて、オブジェクトをパス上のポイントからポイントに移動したいと考えています。これらの位置を cocosbuilder ファイル (.ccbi) から抽出したいと考えています。では、配列内の位置を抽出するにはどうすればよいでしょうか?

1 つの方法は、位置にスプライトを配置し、spr1、spr2、spr3 などの変数を割り当てることです。

コードで spr1.position を取得します。

もう 1 つの方法は、cocos-builder で位置アニメーションを作成することです。コード内のこれらのキーフレームの位置を抽出します。私の質問は、「アニメーションのキーフレームから位置を抽出する方法はありますか?」ということです。

4

2 に答える 2

1

これは、CocosBuilder2.1で機能するソリューションです。次の関数をCCBAnimationManagerクラスに追加します。

- (void)enumeratePropertiesForSequence:(NSString*)name Block:(BOOL(^)(CCNode *node, CCBSequenceProperty *seqProp))block
{
    int seqId = [self sequenceIdForSequenceNamed:name];
    if (seqId == -1)
    {
        NSLog(@"Sequence %@ couldn't be found",name);
        return;
    }
    for (NSValue* nodePtr in nodeSequences)
    {
        CCNode* node = [nodePtr pointerValue];

        NSDictionary* seqs = [nodeSequences objectForKey:nodePtr];
        NSDictionary* seqNodeProps = [seqs objectForKey:[NSNumber numberWithInt:seqId]];

        // Nodes that have sequence node properties
        for (NSString* propName in seqNodeProps)
        {
            CCBSequenceProperty* seqProp = [seqNodeProps objectForKey:propName];

            if (!block(node, seqProp))
                return;
        }
    }
}

この列挙子を使用すると、使用可能なすべてのプロパティにアクセスできます。たとえば、位置だけに関心がある場合は、次のようになります。

#import "MyClass.h"
#import "CCBAnimationManager.h"
#import "CCBSequenceProperty.h"
#import "CCBKeyframe.h"
#import "CCNode+CCBRelativePositioning.h"

@implementation MyClass
-(void)fn
{
    CCBAnimationManager* animationManager = self.userObject;

    BOOL(^block)(CCNode *node, CCBSequenceProperty *seqProp) =
    ^BOOL(CCNode *node, CCBSequenceProperty *seqProp)
    {
        NSLog(@"Node tag %d, Prop name [%@], type %d", node.tag, seqProp.name, seqProp.type);

        for (CCBKeyframe *kf in seqProp.keyframes)
        {
            if ([seqProp.name isEqualToString:@"position"])
            {
                id value = kf.value;

                // Get relative position
                float x = [[value objectAtIndex:0] floatValue];
                float y = [[value objectAtIndex:1] floatValue];

                // Get position type
                int type = [[[self.userObject baseValueForNode:node propertyName:seqProp.name] objectAtIndex:2] intValue];

                CGSize containerSize = [self.userObject containerSize:node.parent];

                CGPoint absPos = [node absolutePositionFromRelative:ccp(x,y) type:type parentSize:containerSize propertyName:seqProp.name];

                NSLog(@"--- relative position (%f, %f), type %d, abs position (%f, %f)", x, y, type, absPos.x, absPos.y);
            }
        }

        return YES; // YES to continue, NO to stop enumeration
    };

    [animationManager enumeratePropertiesForSequence:@"MySequence" Block:block];
}

@end

MyClassをインスタンス化し、列挙子を呼び出す方法は次のとおりです。

CCNode *myclass = [CCBReader nodeGraphFromFile:@"MyClass.ccbi"];
[myclass fn];
于 2013-03-11T03:47:43.453 に答える
0

私はそれを自分でやったことがありませんが、それは可能だと思います。ccb ファイルを調べると、それが単なる XML ファイルであることがわかります。そして、この XML ファイルにはキーフレーム情報 (どのキーフレームがいつ発生するか) のみが格納されます。

ccb ファイルの詳細な構造については、こちらを参照してください。キーフレーム情報を取得する方法を確認したい場合があります。

于 2012-12-23T09:50:07.697 に答える