iOS SpriteKit How to make stroke color transparent?

空扰寡人 提交于 2020-01-03 03:21:11

问题


I do some simple games using SpriteKit now. There is one problem with stroke color in drawing process.

I have to do my colored shapeNode transparent, but my stroke color stays the same every time. I've tried different techniques to do my node be entirely transparent: 1)setting alpha component to stroke color 2)setting alpha component to whole node. It didn't help. Is there is any way to achieve or get around this?

Creation of my node

CGMutablePathRef arc = CGPathCreateMutable();
    cardWidth = cardWidth + cardAlpha;
CGPathAddRoundedRect(arc, NULL, CGRectMake(-cardWidth/2, -cardHeight/2, cardWidth, cardHeight), roundRadius, roundRadius);
roundRect = [SKShapeNode node];
roundRect.name = self.name;
CGFloat lineWidth = 2.0;
CGPathRef strokedArc =
CGPathCreateCopyByStrokingPath(arc, NULL,
                                   lineWidth,
                                   kCGLineCapButt,
                                   kCGLineJoinMiter, // the default
                                   10); // 10 is default miter limit


roundRect.path = strokedArc;
[self addChild:roundRect];

Then i try to change color and opacity

roundRect.fillColor = rightColor;
roundRect.strokeColor = rightColor;
roundRect.strokeColor = rightColor;
termLabel.fontColor = rightColor;
roundRect.alpha = 0.5;

回答1:


I think the problem is with your path. the fill color is covering your stoke so you don't see any change of the stroke color. But with my test, the node.alpha component should work. It maybe the type of iOS version, Apple may change how some things work together.

Here is some code to play with:

    CGMutablePathRef arc = CGPathCreateMutable();
    CGFloat cardWidth = 100;
    CGFloat cardHeight = 170;
    CGFloat roundRadius = 10;
    CGFloat r,g,b = 1; // color components
    CGRect rect = CGRectMake(-cardWidth/2, -cardHeight/2, cardWidth, cardHeight);
    CGPathAddRoundedRect(arc, NULL, rect, roundRadius, roundRadius);
    __block SKShapeNode *roundRect = [SKShapeNode node];
    roundRect.name = @"card";
    CGFloat lineWidth = 20.0;
    CGPathRef strokedArc =
    CGPathCreateCopyByStrokingPath(arc, NULL,
                                   lineWidth,
                                   kCGLineCapButt,
                                   kCGLineJoinMiter, // the default
                                   10); // 10 is default miter limit

    roundRect.path = strokedArc;
//    roundRect.alpha = 0.3; // uncomment if want to use.
    [scene addChild:roundRect];

    // delay
    SKAction *waitAction = [SKAction waitForDuration:1/15.0f];

    // variables
    static CGFloat direction = 1;
    static CGFloat speed = .1f;
    static CGFloat alpha = 0;

    // action to aniamte shape
    SKAction *changeColorAction = [SKAction runBlock:^{
        CGFloat vel = direction * speed;
        CGFloat newValue = alpha + vel;
        if(newValue < 0 || newValue > 1){
            direction *= -1;
        } else {
            alpha = newValue;
        }

        UIColor *newColor = [UIColor colorWithRed:r green:g blue:b alpha:alpha];

        // animate shape
        [roundRect setStrokeColor:newColor];
//        [roundRect setFillColor:newColor]; // uncoment to animate.
    }];

    // Did SKAction because its under the scene run loop.
    SKAction *seq = [SKAction sequence:@[ waitAction, changeColorAction ]];
    [scene runAction:[SKAction repeatActionForever:seq]];


来源:https://stackoverflow.com/questions/26606624/ios-spritekit-how-to-make-stroke-color-transparent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!