我认为我主要是在批评我使用Player类的方式,以及如何改进它。
我的spritesheet包含我认为我需要采取的行动所需的所有序列。但我最初想要的是,当按下“跳转”按钮时,角色正在经历的动画停止,并且它使用的spritesheet中的“跳跃”序列。 (步行 - 例如第7帧到第9帧,其中跳跃是第10帧到第13帧)。
以下是我制作播放器精灵的方法:
Player.m:
-(id)playerCharacter {
if (self = [super init]) {
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Soldier.plist"];
// Create a sprite sheet with the Player images
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"Soldier.png"];
[self addChild:spriteSheet z:15];
NSMutableArray *walking = [NSMutableArray array];
for(int i = 7; i <= 9; ++i) {
[walking addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"Soldier%d.png", i]]];
}
CCAnimation *walkingAnimation = [CCAnimation animationWithSpriteFrames:walking delay:0.2f];
_walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkingAnimation]];
walkAnim.restoreOriginalFrame = NO;
[self runAction:_walkAction];
self.velocity = ccp(0.0, 0.0);
}
return self;
}
GameLevelLayer.m
player = [[Player alloc] playerCharacter];
player.position = ccp(100,50);
[map addChild:player z:15];
我想我的问题是...... 我应该将该方法的整个CCAnimation组件移出一个新方法,检查一系列定义spritesheet / animation序列的BOOL吗?
我是否以最有效的方式使用上述代码?虽然我很欣赏它的工作原理。我宁愿理解我是否正确地做了事情,而不是继续沿着一条为我的项目增加低效率的道路。
我非常感谢任何反馈和帮助。
答案 0 :(得分:1)
您没有正确使用CCSpriteBatchNode。把它想象成一个层,它将从一个精灵表中保存你所有的精灵。您的玩家应该被添加到batchnode,并且您的batchnode被添加到您的游戏层。因此,您的播放器应按如下方式创建:
-(id)playerCharacterOnSheet:(CCSpriteBatchNode*)batchNode
{
// this is assuming Player is a CCSprite subclass
// set this to the "static"/default player sprite image
if (self = [super initWithSpriteFrameName:@"Soldier1.png"])
{
// Load self to the batchnode
[batchNode addChild:self];
NSMutableArray *walking = [NSMutableArray array];
for(int i = 7; i <= 9; ++i) {
[walking addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"Soldier%d.png", i]]];
CCAnimation *walkingAnimation = [CCAnimation animationWithSpriteFrames:walking delay:0.2f];
_walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkingAnimation]];
walkAnim.restoreOriginalFrame = NO;
[self runAction:_walkAction];
self.velocity = ccp(0.0, 0.0);
}
return self;
}
然后在GameLevelLayer中,创建batchNode和player:
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Soldier.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"Soldier.png"];
[map addChild:spriteSheet];
player = [[Player alloc] playerCharacterOnSheet:spriteSheet];
player.position = ccp(100,50);
要执行其他操作,只需向Player类添加方法即可执行它们(并停止任何其他正在运行的操作)。例如:
-(void)jumpAction
{
[self stopAllActions];
NSMutableArray *jumping = [NSMutableArray array];
for(int i = 10; i <= 13; ++i) {
[jumping addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"Soldier%d.png", i]]];
}
CCAnimation *jumpingAnimation = [CCAnimation animationWithSpriteFrames:jumping delay:0.2f];
CCAction *jumpAction = [CCAnimate actionWithAnimation:jumpingAnimation ];
[self runAction:jumpAction];
}
要执行,请致电:
[player jumpAction];