我的问题是在精灵移动期间动画无法正常工作。 以下是我正在使用的代码
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
[selSprite resumeSchedulerAndActions];
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
[self selectSpriteForTouch:touchLocation];
return TRUE;
}
- (void)selectSpriteForTouch:(CGPoint)touchLocation
{
CCSprite * newSprite = nil;
for (CCSprite *sprite in movableSprite) {
if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {
newSprite = sprite;
break;
}
}
if (newSprite != selSprite) {
[selSprite stopAllActions];
selSprite = newSprite;
_MoveableSpritetouch = TRUE;
}
if(_MoveableSpritetouch==TRUE)
{
movement=0;
CGRect selRect=CGRectMake((SpriteX)-20.0,(SpriteY)-20.0,40.0,40.0);
if(CGRectContainsPoint(selRect, touchLocation))
{
[selSprite stopAllActions];
}
if((selSprite==MarshallCar)&& (!(CGRectContainsPoint(selRect, touchLocation))))
{
movement=1;
[self reorderChild:selSprite z:5];
NSMutableArray *MarshallCarWalkAnimFrames = [NSMutableArray array];
for(int i = MarshallCarTouchStartFrameIndex; i <= MarshallCarTouchEndFrameIndex; ++i) {
[MarshallCarWalkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"mcar_move_%d.png", i]]];
}
MarshallCarWalkAnim = [CCAnimation animationWithFrames:MarshallCarWalkAnimFrames delay:MarshallCarTouchFrameDelay];
walkMarshallCar = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:MarshallCarWalkAnim restoreOriginalFrame:NO]];
[selSprite runAction:walkMarshallCar];
}
}
}
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
if(gameState == TRUE){
CGPoint point = [touch locationInView:[touch view]];
point = [[CCDirector sharedDirector] convertToGL:point];
if (moveDifference.x>0)
{
selSprite.flipX = YES;
}
else {
selSprite.flipX = NO;
}
[selSprite setPosition:point];
}
}
-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
movement=0;
if(selSprite==MarshallCar)
{
[selSprite setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"mcar_idle.png"]];
}
[selSprite pauseSchedulerAndActions];
}
移动的动画帧不会在每次移动时播放,有时它会播放或有时不播放。当你第一次触摸并移动你的精灵时,它会正常播放,但是如果触摸另一个精灵然后再移动上一个精灵,则无法播放动画的动画。
有人知道为什么会这样吗? 请告诉我删除此错误的正确代码。 感谢!!!
答案 0 :(得分:0)
我相信你的问题是if / else if结构:
if (_MoveableSpritetouch==TRUE)
{
CGRect selRect = CGRectMake(SpriteX - 20, SpriteY - 20, 40, 40);
if(CGRectContainsPoint(selRect, touchLocation))
{
[selSprite stopAllActions];
}
else if(...)
{
...
[selSprite runAction:walkMarshallCar];
}
}
如果您没有立即看到它:如果触摸位置在selRect内部,则在所选(新)精灵上调用stopAllActions而不执行任何其他操作。仅当触摸位置不在该矩形内时,您才会运行动画操作。
我认为“矩形”检查是多余的,因为你已经在上面几行调用了stopAllActions。
请允许我对您的代码进行一些一般性评论:
方法“selectSpriteForTouch”告诉我你正在选择一个新的精灵。功能就是这样。但它没有宣传播放动画。您可能希望将其重构为单独的“playAnimationOnSelectedSprite”方法。
您多次写了20.0和40.0。这意味着您实际上将一个double(8字节浮点数据类型)传递给CGPoint,它接受浮点数(4字节浮点数)。严格地说,使用带有后缀“f”的20.0f将其表示为浮点数据类型,或者使用整数,因为您不使用浮点部分。
为什么你把(SpriteX)放在括号中我不清楚,如果你想提高可读性,你可以通过在逗号和操作数之后添加空格来实现更多。
在Objective-C中,使用YES和NO宏而不是TRUE和FALSE。
bool变量_MoveableSpritetouch似乎是多余的,除非在其他地方需要。在任何情况下,您应该将以下if(_MoveableSpritetouch == TRUE)块移动到您将_MoveableSpritetouch变量设置为TRUE的位置,因为它只是通过设置变量使您的代码更难读取,留下您所在的代码块(if(selSprite) != newSprite))只是为了跳转到另一个代码块(if(_MoveableSpritetouch == TRUE)),你已经知道你将要运行。
答案 1 :(得分:0)
if((selSprite==MarshallCar)&& (!(CGRectContainsPoint(selRect, touchLocation))))
{
movement=1;
[self reorderChild:selSprite z:5];
NSMutableArray *MarshallCarWalkAnimFrames = [NSMutableArray array];
for(int i = MarshallCarTouchStartFrameIndex; i <= MarshallCarTouchEndFrameIndex; ++i) {
[MarshallCarWalkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"mcar_move_%d.png", i]]];
}
MarshallCarWalkAnim = [CCAnimation animationWithFrames:MarshallCarWalkAnimFrames delay:MarshallCarTouchFrameDelay];
walkMarshallCar = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:MarshallCarWalkAnim restoreOriginalFrame:NO]];
[selSprite runAction:walkMarshallCar];
}
我添加了[selSprite stopAllActions]; 并且它开始正常工作,因为在触摸结束方法我暂停了行动 但是没有恢复它们所以当我第二次触摸精灵时它没有播放动画,因为动作暂停了。