Ios 如何在Cocos2D中使精灵在更新循环内跳转

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

我有一个从上面掉下来的球精灵和一个男孩在它下面。当球击中男孩的头部时,我希望它沿着抛物线路径运动。我试着使用CCJumpTo如下,但我无法让它工作。我在更新循环中调用操作。不允许我这样做吗?我不能在更新循环中调用CCJumpTo吗

- (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时;我可以看到抛物线球的速度比球的上升速度快。我最终在没有更新方法的帮助下让它工作。这就是问题的原因。