从不同的班级改变行动的CCSpeed?

时间:2012-03-24 00:24:32

标签: ios cocos2d-iphone freeze

所以我试图将Cocos2D示例中的EaseActionsTest示例中的alterTime方法实现到我的游戏中。

我正在尝试将这个想法应用到我的游戏中,以便为我的游戏创建一个冻结时间类型的加电。我已经设置了一个带有CCMenu的单独HUDLayer,将小行星的CCSpeed更改为0以停止移动。我已经设置了一个CCLog来确保我的freezeTime方法被调用,但它确实如此,但是小行星的CCSpeeds不受影响。这是我的代码,以便更清晰。

HUDLayer.h

#import "ActionLayer.h"

@interface HUDLayer : CCLayer {
    GameObject *asteroid;
}

-(void)freezeTime:(ccTime)dt;

HUDLayer.mm

-(void)freezeTime:(ccTime)dt
{
    id action = [asteroid getActionByTag:kTagAsteroidAction];
    [action setSpeed:0.0f];
    CCLOG(@"Freeze!");
}

-(void)createPowerUpButtons
{
    CGSize winSize = [CCDirector sharedDirector].winSize;
    CCSprite *freeze = [CCSprite spriteWithSpriteFrameName:@"powerup.png"];
    CCMenuItem *freezeButton = [CCMenuItemImage itemFromNormalSprite:freeze selectedSprite:nil target:self selector:@selector(freezeTime)];

    CCMenu *powerUpMenu = [CCMenu menuWithItems:freezeButton, nil];
    powerUpMenu.position = ccp(winSize.width * 0.5, winSize.height * 0.1);
    [self addChild:powerUpMenu];
}

-(id)init
{
    if( (self = [super init]) )
    {
        [self createPowerUpButtons];
    }
    return self;
}

ActionLayer.h

#import "HUDLayer.h"
#import "GameObject.h"

enum Actions
{
    kTagAsteroidAction = 1
};
@interface ActionLayer : CCLayer
{
    GameObject *asteroid;
}

ActionLayer.mm

-(void)updateAsteroids:(ccTime)dt
{
    // ---------------------------------------------
    //  Code to set random sizes and speeds for the asteroids from the array...
    // ---------------------------------------------

        // Move it offscreen to the left, and when it's done, call removeNode
        id action = [CCSequence actions:
                     [CCMoveBy actionWithDuration:randDuration position:ccp(-winSize.width - asteroid.contentSize.width, 0)],
                     [CCCallFuncN actionWithTarget:self selector:@selector(invisNode:)], nil];
        [action setTag:kTagAsteroidAction];

        [asteroid runAction:[CCSpeed actionWithAction:action speed:1.0f]];

        [self schedule:@selector(freezeTime:) interval:1.0f];
    }
}

-(void)update:(ccTime)dt
{
    [self updateAsteroids:dt];
}

我试图尽可能接近EaseActionsTest示例,但我在启动时一直收到此错误:

'+[NSInvocation invocationWithMethodSignature:]: method signature argument cannot be nil'

我认为这是因为 - (void)freezeTime: (ccTime)dt ,因为在此之前,我原本只是尝试 - (void)freezeTime ;我会收到我在freezeTime方法中设置的CCLog,看到它被调用,但小行星的速度没有受到影响。

另外,我试过了:

-(void)freezeTime
{
    id action = [asteroid getActionByTag:kTagAsteroidAction];
    [action setSpeed:0.1f];
    CCLOG(@"Freeze!");
}

-(id)init
{
    if( (self = [super init]) )
    {
        [self freezeTime];
    }
    return self;
}

我刚注意到这里的速度也不受影响。

关于我能做些什么才能使这项工作的想法?任何有用的想法总是受到赞赏!

1 个答案:

答案 0 :(得分:0)

嗯......我认为当你决定对你的小行星进行动作时,这是一个错误。操作应该随着时间的推移而起作用,您通常会执行一次操作,并等待它完成。我看到你正在为每个小行星添加动作,这可能是问题所在。我会更改函数的名称以及调用它的次数。

-(void)createAsteroidMovement: (GameObject*) asteroid
{
    // ---------------------------------------------
    //  Code to set random sizes and speeds for the asteroids from the array...
    // ---------------------------------------------

        // Move it offscreen to the left, and when it's done, call removeNode
        id action = [CCSequence actions:
                     [CCMoveBy actionWithDuration:randDuration position:ccp(-winSize.width - asteroid.contentSize.width, 0)],
                 [CCCallFuncN actionWithTarget:self selector:@selector(invisNode:)], nil];
        [action setTag:kTagAsteroidAction];

        [asteroid runAction:[CCSpeed actionWithAction:action speed:1.0f]];

        [self schedule:@selector(freezeTime:) interval:1.0f];
    }
}

-(void)update:(ccTime)dt
{
     if (!_createdAsteroidMovement)
     {
         [self createAsteroidMovement: asteroid];
         _createdAsteroidMovement = true;
     }
}