Ios Cocos2d多包装精灵表动画示例-如何加载多包装精灵表?
我是Cocos2d新手,在过去的3天里,我一直在尝试加载多包精灵表动画 我找不到教程或工作示例,查看并找到了这篇讨论单文件精灵表动画的帖子: 这也不起作用: 那么如何加载一个多包装的精灵表呢 谢谢 我添加了部分有效的代码。问题是: 1) 文件-ipadhd和-hd未按预期识别(在其他动画中识别它们,因此AppDelegate中的设置正常) 2) 当加载多包装动画时,我得到一个异常 文件示例:apple0.png,apple0.plist,apple0-hd.png,apple0-hd.plist,apple1-hd.png,apple1-hd.plist,apple0-ipadhd.png,apple0-ipadhd.plist,apple1-ipadhd.png,apple1-ipadhd.plistIos Cocos2d多包装精灵表动画示例-如何加载多包装精灵表?,ios,objective-c,animation,cocos2d-iphone,Ios,Objective C,Animation,Cocos2d Iphone,我是Cocos2d新手,在过去的3天里,我一直在尝试加载多包精灵表动画 我找不到教程或工作示例,查看并找到了这篇讨论单文件精灵表动画的帖子: 这也不起作用: 那么如何加载一个多包装的精灵表呢 谢谢 我添加了部分有效的代码。问题是: 1) 文件-ipadhd和-hd未按预期识别(在其他动画中识别它们,因此AppDelegate中的设置正常) 2) 当加载多包装动画时,我得到一个异常 文件示例:apple0.png,apple0.plist,apple0-hd.png,apple0-hd.plist
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL exists = YES;
int plistIndex = -1;
int tmpPlistIndex;
NSMutableArray *availablePLists = [NSMutableArray array];
NSMutableArray *imageFrames = [NSMutableArray array];
NSMutableArray *spriteSheets = [NSMutableArray array];
frameCount = 0;
do {
plistIndex +=1;
NSString* plistFileName = [NSString stringWithFormat:@"%d%@",plistIndex,item.fileName];
plistFileName = [[NSBundle mainBundle] pathForResource:plistFileName ofType:@"plist"];
plistPath = plistFileName;
[availablePLists addObject:plistPath];
plistDict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
frames = [plistDict objectForKey:@"frames"];
frameCount += frames.count;
tmpPlistIndex = plistIndex + 1;
plistFileName = [NSString stringWithFormat:@"%d%@",tmpPlistIndex,item.fileName];
plistFileName = [[NSBundle mainBundle] pathForResource:plistFileName ofType:@"plist"];
exists = [fileManager fileExistsAtPath:plistFileName];
} while (exists);
NSLog(@"frame count is: %d",frameCount);
plistIndex = -1;
exists = YES;
for(NSString *availablePList in availablePLists)
{
plistIndex += 1;
plistDict = [[NSDictionary alloc] initWithContentsOfFile:availablePList];
NSLog(@"PLIST FILE NAME = %@",availablePList );
frames = [plistDict objectForKey:@"frames"];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:availablePList];
NSString* imageFileName = [NSString stringWithFormat:@"%d%@.png",plistIndex,item.fileName];
// NSDictionary* metadata = [plistDict objectForKey:@"metadata"];
// NSString* imageFileName = [metadata objectForKey:@"realTextureFileName"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:imageFileName];
[self addChild:spriteSheet z:100];
item.spriteSheet = spriteSheet;
[spriteSheets addObject:spriteSheet];
for (int i=0; i<frameCount; i++) {
NSString * fileToLoad;
if(i<10){
fileToLoad = [NSString stringWithFormat:@"%@/000%d",item.fileName,i];
}
else if (i<100){
fileToLoad = [NSString stringWithFormat:@"%@/00%d",item.fileName,i];
}
else{
fileToLoad = [NSString stringWithFormat:@"%@/0%d",item.fileName,i];
}
if ([frames objectForKey:fileToLoad]){
NSLog(@"Found : %@",fileToLoad);
[imageFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:fileToLoad]];
}
}
}//End available plists
item.spriteAnimation = [CCAnimation animationWithSpriteFrames:imageFrames delay:0.1f];
NSString* spriteImageName = [NSString stringWithFormat:@"%@/0000",item.fileName];
NSLog(@"IMAGE LOADING spriteImageName : %@",spriteImageName);
item.sprite = [CCSprite spriteWithSpriteFrameName:spriteImageName];
NSLog(@"IMAGE LOADED spriteImageName : %@",spriteImageName);
CGPoint point = item.itemInfo.position;//info.position;
CGPoint pointScaled = [self scalePoint:point];
item.sprite.position = pointScaled;
NSLog(@"POS name-%@ pos (%f, %f)",item.name,item.sprite.position.x,item.sprite.position.y);
item.sprite.anchorPoint=ccp(0, 0);
for(CCSpriteBatchNode* spriteSheet in spriteSheets){
//[spriteSheet addChild:item.sprite];
[self addChild:item.sprite];
}
NSFileManager*fileManager=[NSFileManager defaultManager];
布尔存在=是;
int-plistIndex=-1;
int-tmpplistinex;
NSMutableArray*可用列表=[NSMutableArray];
NSMutableArray*imageFrames=[NSMutableArray];
NSMutableArray*精灵表=[NSMutableArray];
帧数=0;
做{
plistIndex+=1;
NSString*plistFileName=[NSString stringWithFormat:@“%d%”,plistIndex,item.fileName];
plistFileName=[[NSBundle mainBundle]pathForResource:plistFileName的类型:@“plist”];
plistPath=plistFileName;
[availablePLists addObject:plistPath];
plistDict=[[NSDictionary alloc]initWithContentsOfFile:plistPath];
frames=[plistDict objectForKey:@“frames”];
frameCount+=frames.count;
tmpplistinex=plistIndex+1;
plistFileName=[NSString stringWithFormat:@“%d%”,tmpplistinex,item.fileName];
plistFileName=[[NSBundle mainBundle]pathForResource:plistFileName的类型:@“plist”];
exists=[fileManager fileExistsAtPath:plistFileName];
}虽然(存在);
NSLog(@“帧计数为:%d”,帧计数);
plistIndex=-1;
存在=是;
for(可用列表中的NSString*可用列表)
{
plistIndex+=1;
plistDict=[[NSDictionary alloc]initWithContentsOfFile:availablePList];
NSLog(@“PLIST FILE NAME=%@”,availablePList);
frames=[plistDict objectForKey:@“frames”];
[[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:availablePList];
NSString*imageFileName=[NSString stringWithFormat:@“%d%@.png”,plistIndex,item.fileName];
//NSDictionary*元数据=[plistDict objectForKey:@“metadata”];
//NSString*imageFileName=[metadata objectForKey:@“realTextureFileName”];
CCSpriteBatchNode*spriteSheet=[CCSpriteBatchNode batchNodeWithFile:imageFileName];
[self-addChild:spriteSheet z:100];
item.spriteSheet=spriteSheet;
[精灵表添加对象:精灵表];
对于(int i=0;i我在使用js绑定的cocos2d-html5和CoCoCoS2DX中工作,但是-我的答案应该仍然适用。据我所知,cocos2d中没有对multipack的特殊处理,这是纹理打包器中可用的构造。您应该加载所有的plists+png,就像它们是单个节点一样。从那里,您应该能够o从其中任何一个创建精灵和动画,因为它们都在缓存中
代码:
jc.makeSpriteWithMultipackPlist=函数(plists、pngs、startFrame){
var sprite=new cc.sprite();
对于(var i=0;i,您的问题是什么?我的问题是如何加载多包精灵表?什么是“多包”精灵表?我从未听说过这个术语。如果您指的是两个或更多精灵表,您只需逐个加载,但每个表(atlas)必须使用一个批处理节点。我刚刚添加了代码。请帮助:)
jc.makeSpriteWithMultipackPlist = function(plists, pngs, startFrame){
var sprite = new cc.Sprite();
for(var i =0;i<plists.length;i++){
var plist = plists[i];
var png = pngs[i];
if (!jc.parsed[plist]){
cc.SpriteFrameCache.getInstance().addSpriteFrames(plist);
cc.SpriteBatchNode.create(png);
jc.parsed[plist]=true;
}
}
var frame = cc.SpriteFrameCache.getInstance().getSpriteFrame(startFrame);
if (!frame){
throw "Frame: " + startFrame + " not in cache.";
}
sprite.initWithSpriteFrame(frame);
sprite.retain();
return sprite;
}