在我的应用程序中,我想在路径上从点到点移动对象(基于某些事件)。我想从 cocosbuilder 文件(.ccbi)中提取这些位置。那么如何提取数组中的位置呢?
一种方法是将精灵放在位置上并使用变量分配它们,例如:spr1,spr2 spr3
并取代码中的 spr1.position 。
另一种方法是在 cocos-builder 中制作位置动画。现在在代码中提取这些关键帧位置。所以我的问题是:“有没有办法从动画关键帧中提取位置?”
在我的应用程序中,我想在路径上从点到点移动对象(基于某些事件)。我想从 cocosbuilder 文件(.ccbi)中提取这些位置。那么如何提取数组中的位置呢?
一种方法是将精灵放在位置上并使用变量分配它们,例如:spr1,spr2 spr3
并取代码中的 spr1.position 。
另一种方法是在 cocos-builder 中制作位置动画。现在在代码中提取这些关键帧位置。所以我的问题是:“有没有办法从动画关键帧中提取位置?”
这是一个适用于 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];
我认为这是可能的,虽然我自己没有这样做。如果您查看 ccb 文件,您会注意到它只是一个 XML 文件。而且这个 XML 文件只存储关键帧信息(哪个关键帧发生在什么时候)。
ccb 文件的结构有据可查。您可能想看看如何获取关键帧信息。