【问题标题】:i want my falling sprites to dissapear half way down the screen我希望我的下落精灵在屏幕的一半消失
【发布时间】:2012-02-09 18:39:56
【问题描述】:

我是编程新手,我一直在用 cocos2d 做实验,问题出在这里,我做了一个简单的游戏,设备是纵向的,它有掉落的精灵,我希望精灵在顶部的位置消失sprite

这里有一些你可能感兴趣的代码:

这是下落的精灵,它从屏幕顶部落到底部

-(void)addRock {

CCSprite *rock = [CCSprite spriteWithFile:@"rock.png" 
                                     rect:CGRectMake(0, 0, 27, 40)]; 

// Determine where to spawn the target along the X axis
CGSize winSize = [[CCDirector sharedDirector] winSize];
int minX = rock.contentSize.width/2;
int maxX = winSize.width - rock.contentSize.width/2;
int rangeX = maxX - minX;
int actualX = (arc4random() % rangeX) + minX;

// Create the target slightly off-screen along the right edge,
// and along a random position along the X axis as calculated above
rock.position = ccp(actualX, 500);
[self addChild:rock];

// Determine speed of the target
int actualDuration = spriteDuration;//speed of sprite

// Create the actions
id actionMove = [CCMoveTo actionWithDuration:actualDuration position:ccp(actualX,-winSize.height+ rock.contentSize.height)];
id actionMoveDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)];
[rock runAction:[CCSequence actions:actionMove, nil]];

}

当精灵移动完成时

-(void)spriteMoveFinished:(id)sender {
CCSprite *sprite = (CCSprite *)sender;
[self removeChild:sprite cleanup:YES];

}

【问题讨论】:

  • 我相信你的 spriteMoveFinished 没有被调用?
  • 还没有,如何让它与精灵代码相匹配?
  • 好的,刚刚添加:id actionMoveDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)];
  • 那么你的 spriteMoveFinished 现在什么时候被调用了?
  • 是的,它被调用了,我已将它添加到我上面的代码中。

标签: iphone objective-c ios5 cocos2d-iphone


【解决方案1】:

要在动画的中途淡出你的精灵,你可以使用 CCSpawn 将 falling 动画与 fadeOut 结合起来。但是由于您希望它在给定时间后淡出,您需要创建一个由CCDelayTimeCCFadeOut 组成的序列。

double fadeStart = 0.5;
id wait    = [CCDelayTime actionWithDuration: actualDuration * fadeStart];
id fadeOut = [CCFadeOut actionWithDuration: actualDuration * (1.0 - fadeStart)];
id waitThenFade = [CCSequence actions: wait, fadeOut, nil];

id actionMove = ...;
id fullAnimation = [CCSpawn actions:actionMove, waitThenFade, nil];

[rock runAction:[CCSequence actions:fullAnimation, actionMoveDone, nil]];

如果您希望早点或晚点开始淡入淡出,您只需移动 fadeStart 值。 0 会立即开始,1 实际上不会褪色,所以最好在两者之间选择一个值。

【讨论】:

  • 感谢您的快速回复,您的代码第 3 行,actualDuration 之后是否有 *?
  • 我也将您的最后一行编辑为:[rock runAction:[CCSpawn actions:actionMove,waitThenFade,actionMoveDone, nil]];
  • 我一定忘记了actionMoveDone,因为您也没有将其放在原始帖子中;)但是您必须将其包装在一个序列中,因为您可能希望触发 moveDone在最后一个事件之后。
  • 啊,我还是不能让它褪色!我看不出问题出在哪里!
  • 我和上面一样,但有:id actionMove = [CCMoveTo actionWithDuration:actualDuration position:ccp(actualX,-winSize.height+rock.contentSize.height)];id actionMoveDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)];
【解决方案2】:

也许是这样的?

CGSize size = [[CCDirector sharedDirector] winSize];

CCSprite* img = [[CCSprite alloc] initWithFile:@"yourSprite.png"];
img.position = ccp(size.width/2,size.height + img.boundingBox.size.height/2);
[img runAction:[CCSequence actions:
                    [CCMoveTo actionWithDuration:3 position:ccp(img.position.x,size.height/2 - img.boundingBox.size.height/2)],
                    [CCFadeOut actionWithDuration:1],
                    [CCCallFuncN actionWithTarget:nil selector:@selector(spriteMoveFinished:)],
                    nil]];

【讨论】:

  • 如何移动到屏幕的一半?我试过了,但我不确定我是否做得对
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多