cocos2d:CocosBuilder:如何获取动画关键帧的位置

时间:2012-12-12 16:15:37

标签: cocos2d-iphone

在我的应用程序中,我想在路径上从一个点移动一个对象(基于某个事件)。我想从cocosbuilder文件(.ccbi)中提取这些位置。那么如何在数组中提取位置呢?

一种方法是将精灵放在位置上,并为它们分配如下变量: spr1,spr2 spr3

并在代码中使用spr1.position。

另一种方法是在cocos-builder中制作位置动画。现在在代码中提取这些关键帧位置。所以我的问题是:“有没有办法从动画关键帧中提取位置?”

2 个答案:

答案 0 :(得分:1)

这是一个适用于CocosBuilder 2.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];

答案 1 :(得分:0)

我认为这是可能的,虽然我自己也没做过。 如果你查看一个ccb文件,你会发现它只是一个XML文件。 此XML文件仅存储关键帧信息(在何时发生关键帧)。

ccb文件here有一个记录良好的结构。 您可能想了解如何获取关键帧信息。