Ios 如何在Cocos2D中使精灵在更新循环内跳转
我有一个从上面掉下来的球精灵和一个男孩在它下面。当球击中男孩的头部时,我希望它沿着抛物线路径运动。我试着使用CCJumpTo如下,但我无法让它工作。我在更新循环中调用操作。不允许我这样做吗?我不能在更新循环中调用CCJumpTo吗Ios 如何在Cocos2D中使精灵在更新循环内跳转,ios,cocos2d-iphone,Ios,Cocos2d Iphone,我有一个从上面掉下来的球精灵和一个男孩在它下面。当球击中男孩的头部时,我希望它沿着抛物线路径运动。我试着使用CCJumpTo如下,但我无法让它工作。我在更新循环中调用操作。不允许我这样做吗?我不能在更新循环中调用CCJumpTo吗 - (void) jump { if(!method_called) { method_called=TRUE; CCActionInterval *jump1 = [CCJumpTo actionWithDuration:3 position:C
- (void) jump
{
if(!method_called)
{
method_called=TRUE;
CCActionInterval *jump1 = [CCJumpTo actionWithDuration:3 position:CGPointMake(400, 400) height:150 jumps:1];
[_ball runAction:jump1];
NSLog(@"something");
}
else
{
NSLog(@"do nothing");
}
}
- (void)update:(ccTime)dt
{
time ++;
if ( dpad.leftJoystick.velocity.x > 0 && x < 2000 ) {
x = x + 10;
} else if ( dpad.leftJoystick.velocity.x < 0 && x > 0 ) {
x = x - 10;
}
if (x > 10 && x < 2000)
_boy.position = ccp(x, 100);
_ball.position = ccp(ball_x, ball_y);
ball_y = _ball.position.y - (speed * rebound);
_boy.anchorPoint = ccp(0, 0);
CGRect boyBox = CGRectMake(_boy.position.x, _boy.position.y, [_boy boundingBox].size.width, [_boy boundingBox].size.height);
_ball.anchorPoint = ccp(0, 0);
CGRect ballBox = CGRectMake(_ball.position.x, _ball.position.y, [_ball boundingBox].size.width, [_ball boundingBox].size.height);
if (CGRectIntersectsRect(boyBox, ballBox) && flag == 0)
{
rebound = -rebound;
flag = 1;
topFlag = 0;
[_ball stopAllActions];
[self jump];
}
if (_ball.position.y > 700 && topFlag == 0)
{
rebound = -rebound;
flag = 0;
topFlag = 1;
}
}
-(无效)跳转
{
如果(!方法_已调用)
{
方法_called=TRUE;
CCActionInterval*jump1=[CCJumpToActionWithDuration:3位置:CGPointMake(400400)高度:150跳:1];
[球跑动作:跳跃1];
NSLog(@“某物”);
}
其他的
{
NSLog(“不做任何事”);
}
}
-(无效)更新:(ccTime)dt
{
时间++;
如果(dpad.leftgoodage.velocity.x>0&&x<2000){
x=x+10;
}else if(dpad.leftgoodage.velocity.x<0&&x>0){
x=x-10;
}
如果(x>10&&x<2000)
_boy.position=ccp(x,100);
_ball.position=ccp(ball_x,ball_y);
ball_y=_ball.position.y-(速度*反弹);
_boy.anchorPoint=ccp(0,0);
CGRect boyBox=CGRectMake(_boy.position.x,_boy.position.y,[[u boy boyingbox].size.width,[[u boy boyingbox].size.height);
_ball.anchorPoint=ccp(0,0);
CGRect ballBox=CGRectMake([u ball.position.x,[u ball.position.y,[[u ball boundingBox].size.width,[[u ball boundingBox].size.height);
if(CGRectIntersectsRect(boyBox、ballBox)和&flag==0)
{
反弹=-反弹;
flag=1;
topFlag=0;
[球塞动作];
[自跳];
}
如果(_ball.position.y>700&&topFlag==0)
{
反弹=-反弹;
flag=0;
topFlag=1;
}
}
提前谢谢
编辑:
这是我的init方法
-(id) init
{
// always call "super" init
// Apple recommends to re-assign "self" with the "super's" return value
if( (self=[super init]) ) {
CGSize winSize = [[CCDirector sharedDirector] winSize];
self.ball = [CCSprite spriteWithFile:@"ball.png"
rect:CGRectMake(0, 0, 50, 50)];
self.ball.position = ccp(275, 999);
[self addChild:self.ball];
x = 0;
ball_y = 650;
ball_x = 300;
rebound = 1;
flag = 0;
topFlag = 0;
speed = 5;
time = 0;
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:
@"boy.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"boy.png"];
//spriteSheet.scaleX = 0.5;
//spriteSheet.scaleY = 0.5;
NSMutableArray *walkAnimFrames = [NSMutableArray array];
for(int i = 1; i <= 8; ++i) {
[walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"boy%d.png", i]]];
CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:.1f];
self.boy = [CCSprite spriteWithSpriteFrameName:@"boy1.png"];
_boy.position = ccp(100000, 100000);
self.walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim]];
[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO];
[_boy runAction:_walkAction];
_boy.flipX = YES;
[spriteSheet addChild:_boy];
dpad = [[MyJoystick alloc] init];
[self addChild:dpad z:10];
[self schedule:@selector(update:)];
}
[self addChild:spriteSheet];
}
return self;
}
-(id)init
{
//始终称为“超级”初始化
//苹果建议用“超级”返回值重新分配“自我”
if((self=[super init])){
CGSize winSize=[[CCDirector sharedDirector]winSize];
self.ball=[CCSprite spriteWithFile:@“ball.png”
rect:CGRectMake(0,0,50,50)];
self.ball.position=ccp(275999);
[self addChild:self.ball];
x=0;
球y=650;
球x=300;
回弹=1;
flag=0;
topFlag=0;
速度=5;
时间=0;
[[CCSpriteFrameCache sharedSpriteFrameCache]添加SpriteFrameSwithFile:
@“男孩,普利斯特”];
CCSpriteBatchNode*spriteSheet=[CCSpriteBatchNode batchNodeWithFile:@“boy.png”];
//spriteSheet.scaleX=0.5;
//spriteSheet.scaleY=0.5;
NSMutableArray*walkAnimFrames=[NSMutableArray];
对于(int i=1;i将操作代码保存在方法中,并使用布尔变量从update方法调用它,以便只调用一次。类似如下:
以.h文件中调用的布尔变量方法_为例:
-(void)update:(ccTime)dt
{
_boy.anchorPoint = ccp(0, 0);
CGRect boyBox = CGRectMake(_boy.position.x, _boy.position.y, [_boy boundingBox].size.width, [_boy boundingBox].size.height);
_ball.anchorPoint = ccp(0, 0);
CGRect ballBox = CGRectMake(_ball.position.x, _ball.position.y, [_ball boundingBox].size.width, [_ball boundingBox].size.height);
if (CGRectIntersectsRect(boyBox, ballBox) && flag == 0)
{
flag = 1; topFlag = 0;
[self callJumpAction];
}
}
-(void)callJumpAction
{
if(!method_called)
{
method_called=true;
CCActionInterval *jump1 = [CCJumpTo actionWithDuration:3 position:CGPointMake(400, 400) height:150 jumps:1];
[_ball runAction:jump1];
}
else
{
NSLog(@"do nothing");
}
}
希望这会有所帮助。您可以调用CCJumpTo inside update loop。我尝试了相同的代码。它似乎有效。可能是其他问题。您确定条件检查中的代码行已执行吗?是的,我已检查。它正在执行。到目前为止,我通过增加_ball.position.y将其反弹回来。这工作正常。但是我想创建一条抛物线路径。这就是我尝试上述操作的原因。但似乎什么都没有发生。你能发布你如何使球移动并添加精灵的代码吗。我在球上尝试了一个简单的moveTo,在更新中,你发布的代码工作正常。因此它必须在其他地方。调用更新方法时d、 我将间隔参数传递为0.1,并且我可以看到其他动画。我认为抛物线动画的时间参数太高,或者我无法看到动画发生。我将把我的init方法也粘贴到一个不相关的注释上。for循环中有很多不必要的代码。您正在添加sprite表和schedu多次刷新。你只需要使用for循环将帧添加到数组中。使用球和男孩的坐标,他们永远不会相遇。发布球如何移动的代码。以前尝试过使用该方法。再次实现了该方法。仍然没有任何结果。当我使用[self schedule:@selector(update:)interval:0.1]调用update时;我可以看到抛物线球的速度比球的上升速度快。我最终在没有更新方法的帮助下让它工作。这就是问题的原因。