【问题标题】:skspritenode color property only setting on first instanceskspritenode 颜色属性仅在第一个实例上设置
【发布时间】:2014-04-17 11:19:08
【问题描述】:

我编写了一个 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]];

【问题讨论】:

    标签: ios sprite-kit skspritenode colorize


    【解决方案1】:
    @implementation RSPaddleSprite
    SKSpriteNode *sprite;
    

    这使得“sprite”成为一个全局变量,所以你实际上只有一个被sprite引用的实例。

    这是使 sprite 成为 ivar 的正确形式:

    @implementation RSPaddleSprite
    {
        SKSpriteNode *sprite;
    }
    

    更正确地坚持 Cocoa 命名约定,其中 ivars 带有下划线前缀:

    @implementation RSPaddleSprite
    {
        SKSpriteNode *_sprite;
    }
    

    【讨论】:

    • 谢谢,这正是问题所在。
    • OP 使用@property 会不会更好,否则他/她将面临实施适当的 setter 和 getter 的开销/麻烦?
    • 从我看到的精灵只在 RSPaddleSprite 类中使用,所以它不必是@property
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    相关资源
    最近更新 更多