Ios 导入.ccbi文件时从其他类访问变量

Ios 导入.ccbi文件时从其他类访问变量,ios,objective-c,cocos2d-iphone,spritebuilder,Ios,Objective C,Cocos2d Iphone,Spritebuilder,我知道这个主题在这里的100篇文章中都有涉及,但是我在这个特定的例子中遇到了很多麻烦,我无法理解它 基本上,我使用Spritebuilder将精灵/节点导入到我的游戏中。我在游戏场景类的主体中导入某个特定类的精灵,但我希望能够在我的精灵类中定义一个变量,然后从游戏场景类编辑它。例如,如果我的精灵在游戏场景中收集硬币,我想在精灵类中的update方法中更改精灵的速度 下面是我的代码,但不幸的是它不起作用。变量increaseY和increaseX在我的游戏场景类中似乎不可用。我知道这是因为我没有正

我知道这个主题在这里的100篇文章中都有涉及,但是我在这个特定的例子中遇到了很多麻烦,我无法理解它

基本上,我使用Spritebuilder将精灵/节点导入到我的游戏中。我在
游戏场景
类的主体中导入某个特定类的精灵,但我希望能够在我的精灵类中定义一个变量,然后从
游戏场景
类编辑它。例如,如果我的精灵在游戏场景中收集硬币,我想在精灵类中的
update
方法中更改精灵的速度

下面是我的代码,但不幸的是它不起作用。变量
increaseY
increaseX
在我的
游戏场景
类中似乎不可用。我知道这是因为我没有正确地实例化
Penguin
类,但我不知道如何在导入该类的.ccbi文件的同时正确地创建该类的实例。问题行被注释,旁边有一堆***,以便轻松找到。它在
gamesene.m
中。我真的很感谢你的帮助,我在这件事上坚持了好几个小时

Penguin.h

#import "CCSprite.h"

@interface Penguin : CCSprite

{
    float xPosition;
    float yPosition;
}

@property (nonatomic,assign) float increaseY;
@property (nonatomic,assign) float increaseX;


@end
#import "CCNode.h"

@interface GameScene : CCNode

@end
Penguin.m

#import "Penguin.h"

@implementation Penguin

@synthesize increaseX;
@synthesize increaseY;


- (id)init {
    self = [super init];

    if (self) {
        CCLOG(@"Penguin created");
    }

    return self;

}

-(void) update:(CCTime)delta
{
    self.position = ccp(self.position.x + increaseX,self.position.y + increaseY);
}

@end
#import "GameScene.h"
#import "Penguin.h"

@implementation GameScene

{
    CCPhysicsNode *_physicsNode;
    CCNode *_catapultArm;
    CCNode *_levelNode;
    CCNode *_contentNode;

}

// is called when CCB file has completed loading
- (void)didLoadFromCCB {

    self.userInteractionEnabled = TRUE;
    CCScene *level = [CCBReader loadAsScene:@"Levels/Level1"];
    [_levelNode addChild:level];
}

// called on every touch in this scene
- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {

    [self launchPenguin];
}

- (void)launchPenguin {
    // loads the Penguin.ccb we have set up in Spritebuilder
    CCNode* penguin = [CCBReader load:@"Penguin"];
    penguin.position = ccpAdd(_catapultArm.position, ccp(16, 50));
    [_physicsNode addChild:penguin];

    //THE FOLLOWING LINE DOES NOT WORK********************************
    penguin.increaseY = 1;
    // Gives Error------Property "increaseX" not found on object of type "CCNode *"

    self.position = ccp(0, 0);
    CCActionFollow *follow = [CCActionFollow actionWithTarget:penguin worldBoundary:self.boundingBox];
    [_contentNode runAction:follow];
}
游戏场景.h

#import "CCSprite.h"

@interface Penguin : CCSprite

{
    float xPosition;
    float yPosition;
}

@property (nonatomic,assign) float increaseY;
@property (nonatomic,assign) float increaseX;


@end
#import "CCNode.h"

@interface GameScene : CCNode

@end
游戏场景.m

#import "Penguin.h"

@implementation Penguin

@synthesize increaseX;
@synthesize increaseY;


- (id)init {
    self = [super init];

    if (self) {
        CCLOG(@"Penguin created");
    }

    return self;

}

-(void) update:(CCTime)delta
{
    self.position = ccp(self.position.x + increaseX,self.position.y + increaseY);
}

@end
#import "GameScene.h"
#import "Penguin.h"

@implementation GameScene

{
    CCPhysicsNode *_physicsNode;
    CCNode *_catapultArm;
    CCNode *_levelNode;
    CCNode *_contentNode;

}

// is called when CCB file has completed loading
- (void)didLoadFromCCB {

    self.userInteractionEnabled = TRUE;
    CCScene *level = [CCBReader loadAsScene:@"Levels/Level1"];
    [_levelNode addChild:level];
}

// called on every touch in this scene
- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {

    [self launchPenguin];
}

- (void)launchPenguin {
    // loads the Penguin.ccb we have set up in Spritebuilder
    CCNode* penguin = [CCBReader load:@"Penguin"];
    penguin.position = ccpAdd(_catapultArm.position, ccp(16, 50));
    [_physicsNode addChild:penguin];

    //THE FOLLOWING LINE DOES NOT WORK********************************
    penguin.increaseY = 1;
    // Gives Error------Property "increaseX" not found on object of type "CCNode *"

    self.position = ccp(0, 0);
    CCActionFollow *follow = [CCActionFollow actionWithTarget:penguin worldBoundary:self.boundingBox];
    [_contentNode runAction:follow];
}

您必须更改此行:

CCNode* penguin = [CCBReader load:@"Penguin"];
Penguin* penguin = (Penguin*)[CCBReader load:@"Penguin"];
关于这一行:

CCNode* penguin = [CCBReader load:@"Penguin"];
Penguin* penguin = (Penguin*)[CCBReader load:@"Penguin"];
在您使用的旧行中,编译器给您一个错误,因为
CCNode
类没有名为
increaseX
的属性
increaseX
Penguin
类的一部分。如果要访问
Penguin
类的属性,需要使用cast并让编译器知道,使用
CCBReader
加载的实际上是
Penguin
实例