Свойство цвета skspritenode устанавливается только в первом экземпляре

Я написал подкласс SKSpriteNode для представления флиппера, который я несколько раз использовал в своей игре. Я пытаюсь установить их цвет, установив свойство цвета дочерних спрайтов, но, похоже, это работает только с одним экземпляром моих спрайтов, независимо от того, какой из них я пытаюсь установить. Пожалуйста, может кто-нибудь сказать мне, что я делаю неправильно, или предложить лучший способ сделать это. я просто хочу иметь возможность устанавливать разные экземпляры моего подкласса спрайтов в разные цвета.

мой подкласс SKSpriteNode выглядит следующим образом:

#import "RSPaddleSprite.h"

@implementation RSPaddleSprite
SKSpriteNode *sprite;

-(id)init{
if (self = [super init]) {
        sprite = [SKSpriteNode spriteNodeWithImageNamed:@"paddle2.png"];
        [self addChild: sprite];
        }
    return self;
    }

-(id)initWithImageNamed:(NSString *)name{
    if (self = [super init]) {
        sprite = [SKSpriteNode spriteNodeWithImageNamed:name];
        [self addChild: sprite];
    }
    return self;
}

//function applies physics body to sprite when required
-(void)applyPhysicsBody{
    self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(sprite.size.width/4, sprite.size.height )];
    self.physicsBody.affectedByGravity = FALSE;
    self.physicsBody.mass = 0.1;
    self.physicsBody.dynamic = TRUE;
}

//function sets color of sprite when required
-(void) setPaddleColor:(SKColor*)color{
    sprite.color = color;
    sprite.colorBlendFactor = 0.9;
}

@end

я вызываю функции подкласса в своей сцене следующим образом:

//initialise paddles, position them, add physics and add to scene
paddle1 = [[RSPaddleSprite alloc ]initWithImageNamed:@"paddle1.png"];
paddle1.position = CGPointMake(self.frame.size.width/5,(self.frame.size.height/2)+30);
[paddle1 applyPhysicsBody];
[self addChild:paddle1];

paddle2 = [[RSPaddleSprite alloc ]initWithImageNamed:@"paddle1.png"];
paddle2.position = CGPointMake((self.frame.size.width/5)*4,(self.frame.size.height/2)+30);
[paddle2 applyPhysicsBody];
[self addChild:paddle2];

paddle3 = [[RSPaddleSprite alloc ]initWithImageNamed:@"paddle1.png"];
paddle3.position = CGPointMake((self.frame.size.width/3),120);
[paddle3 applyPhysicsBody];
[self addChild:paddle3];

paddle4 = [[RSPaddleSprite alloc ]initWithImageNamed:@"paddle1.png"];
paddle4.position = CGPointMake((self.frame.size.width/3)*2,120);
[paddle4 applyPhysicsBody];
[self addChild:paddle4];

//set paddle to appropriate color
[paddle1 setPaddleColor:[SKColor colorWithRed:0.15 green:0.15 blue:0.55 alpha:1.0]];
[paddle2 setPaddleColor:[SKColor colorWithRed:0.15 green:0.15 blue:0.55 alpha:1.0]];
[paddle3 setPaddleColor:[SKColor colorWithRed:0.15 green:0.15 blue:0.55 alpha:1.0]];
[paddle4 setPaddleColor:[SKColor colorWithRed:0.15 green:0.15 blue:0.55 alpha:1.0]];

person ceteri    schedule 17.04.2014    source источник


Ответы (1)


@implementation RSPaddleSprite
SKSpriteNode *sprite;

Это делает «спрайт» глобальной переменной, поэтому у вас действительно есть только один экземпляр, на который ссылается sprite.

Это правильная форма, чтобы сделать sprite иваром:

@implementation RSPaddleSprite
{
    SKSpriteNode *sprite;
}

Правильнее придерживаться соглашений об именах Cocoa, где ивары имеют префикс с подчеркиванием:

@implementation RSPaddleSprite
{
    SKSpriteNode *_sprite;
}
person LearnCocos2D    schedule 17.04.2014
comment
Спасибо, проблема была именно в этом. - person ceteri; 17.04.2014
comment
Не будет ли ОП лучше использовать @property, иначе у него/нее возникнут накладные расходы/хлопоты по реализации соответствующего установщика и геттера? - person fuzzygoat; 17.04.2014
comment
Из того, что я видел, спрайт используется только внутри класса RSPaddleSprite, поэтому он не обязательно должен быть @property - person LearnCocos2D; 18.04.2014