SpriteKit - Как да накарам колелото за награди да се забави с клапа?

Опитвам се да направя игра в стил колело на късмета, като използвам комплект спрайтове. Но аз съм заседнал.

Добре, имам два SKSpriteNode (с физически тела). Колелото, което се върти добре, и „клапачката“ (известна още като нещото, което забавя колелото на наградите и показва каква награда сте спечелили. Клапачката продължава да се избутва нагоре, вместо да се завърта и забавя колелото.

Въпросите ми са:

А) Как да предотвратя движението на "клапача" нагоре, вместо да остана неподвижен отгоре и да забавя колелото.

B) Как да накарам клапата да се огъне, вместо просто да бъде избутана.

В) Защо колелото не се върти повече от веднъж? (Забележка: Опитах да добавя [wheel removeAllActions]; преди всяко докосване да започне:

КОД:

-(id)initWithSize:(CGSize)size {    
if (self = [super initWithSize:size]) {
    /* Setup your scene here */

    self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];

    SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];

    myLabel.text = @"Hello, World!";
    myLabel.fontSize = 30;
    myLabel.position = CGPointMake(CGRectGetMidX(self.frame),
                                   CGRectGetMidY(self.frame));


    myLabel.text = @"Speed: 0";
    myLabel.fontSize = 20;
    myLabel.position = CGPointMake(CGRectGetMinX(self.frame) + 50,
                                   CGRectGetMinY(self.frame));

    /* WHEEL CREATION */
    /*==============================================================================================*/
    wheel = [SKSpriteNode spriteNodeWithImageNamed:@"wheel.png"];
    self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);

    CGFloat offsetX = wheel.frame.size.width * wheel.anchorPoint.x;
    CGFloat offsetY = wheel.frame.size.height * wheel.anchorPoint.y;

    wheel.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinY(self.frame) + 170);

    CGMutablePathRef path = CGPathCreateMutable();

    CGPathMoveToPoint(path, NULL, 132 - offsetX, 276 - offsetY);
    CGPathAddLineToPoint(path, NULL, 122 - offsetX, 283 - offsetY);
    CGPathAddLineToPoint(path, NULL, 116 - offsetX, 272 - offsetY);
    CGPathAddLineToPoint(path, NULL, 108 - offsetX, 271 - offsetY);
    CGPathAddLineToPoint(path, NULL, 100 - offsetX, 268 - offsetY);
    CGPathAddLineToPoint(path, NULL, 95 - offsetX, 266 - offsetY);
    CGPathAddLineToPoint(path, NULL, 87 - offsetX, 261 - offsetY);
    CGPathAddLineToPoint(path, NULL, 86 - offsetX, 260 - offsetY);
    CGPathAddLineToPoint(path, NULL, 73 - offsetX, 263 - offsetY);
    CGPathAddLineToPoint(path, NULL, 72 - offsetX, 250 - offsetY);
    CGPathAddLineToPoint(path, NULL, 65 - offsetX, 246 - offsetY);
    CGPathAddLineToPoint(path, NULL, 58 - offsetX, 239 - offsetY);
    CGPathAddLineToPoint(path, NULL, 53 - offsetX, 234 - offsetY);
    CGPathAddLineToPoint(path, NULL, 48 - offsetX, 227 - offsetY);
    CGPathAddLineToPoint(path, NULL, 36 - offsetX, 225 - offsetY);
    CGPathAddLineToPoint(path, NULL, 39 - offsetX, 213 - offsetY);
    CGPathAddLineToPoint(path, NULL, 34 - offsetX, 206 - offsetY);
    CGPathAddLineToPoint(path, NULL, 32 - offsetX, 200 - offsetY);
    CGPathAddLineToPoint(path, NULL, 30 - offsetX, 194 - offsetY);
    CGPathAddLineToPoint(path, NULL, 27 - offsetX, 187 - offsetY);
    CGPathAddLineToPoint(path, NULL, 26 - offsetX, 183 - offsetY);
    CGPathAddLineToPoint(path, NULL, 15 - offsetX, 175 - offsetY);
    CGPathAddLineToPoint(path, NULL, 23 - offsetX, 166 - offsetY);
    CGPathAddLineToPoint(path, NULL, 22 - offsetX, 163 - offsetY);
    CGPathAddLineToPoint(path, NULL, 22 - offsetX, 154 - offsetY);
    CGPathAddLineToPoint(path, NULL, 22 - offsetX, 143 - offsetY);
    CGPathAddLineToPoint(path, NULL, 23 - offsetX, 133 - offsetY);
    CGPathAddLineToPoint(path, NULL, 16 - offsetX, 122 - offsetY);
    CGPathAddLineToPoint(path, NULL, 26 - offsetX, 117 - offsetY);
    CGPathAddLineToPoint(path, NULL, 27 - offsetX, 112 - offsetY);
    CGPathAddLineToPoint(path, NULL, 28 - offsetX, 108 - offsetY);
    CGPathAddLineToPoint(path, NULL, 31 - offsetX, 101 - offsetY);
    CGPathAddLineToPoint(path, NULL, 34 - offsetX, 96 - offsetY);
    CGPathAddLineToPoint(path, NULL, 37 - offsetX, 88 - offsetY);
    CGPathAddLineToPoint(path, NULL, 39 - offsetX, 85 - offsetY);
    CGPathAddLineToPoint(path, NULL, 36 - offsetX, 72 - offsetY);
    CGPathAddLineToPoint(path, NULL, 48 - offsetX, 71 - offsetY);
    CGPathAddLineToPoint(path, NULL, 51 - offsetX, 68 - offsetY);
    CGPathAddLineToPoint(path, NULL, 54 - offsetX, 63 - offsetY);
    CGPathAddLineToPoint(path, NULL, 60 - offsetX, 59 - offsetY);
    CGPathAddLineToPoint(path, NULL, 65 - offsetX, 54 - offsetY);
    CGPathAddLineToPoint(path, NULL, 71 - offsetX, 49 - offsetY);
    CGPathAddLineToPoint(path, NULL, 73 - offsetX, 37 - offsetY);
    CGPathAddLineToPoint(path, NULL, 85 - offsetX, 39 - offsetY);
    CGPathAddLineToPoint(path, NULL, 91 - offsetX, 36 - offsetY);
    CGPathAddLineToPoint(path, NULL, 97 - offsetX, 33 - offsetY);
    CGPathAddLineToPoint(path, NULL, 103 - offsetX, 30 - offsetY);
    CGPathAddLineToPoint(path, NULL, 109 - offsetX, 28 - offsetY);
    CGPathAddLineToPoint(path, NULL, 116 - offsetX, 26 - offsetY);
    CGPathAddLineToPoint(path, NULL, 123 - offsetX, 16 - offsetY);
    CGPathAddLineToPoint(path, NULL, 133 - offsetX, 24 - offsetY);
    CGPathAddLineToPoint(path, NULL, 138 - offsetX, 22 - offsetY);
    CGPathAddLineToPoint(path, NULL, 145 - offsetX, 22 - offsetY);
    CGPathAddLineToPoint(path, NULL, 152 - offsetX, 22 - offsetY);
    CGPathAddLineToPoint(path, NULL, 160 - offsetX, 22 - offsetY);
    CGPathAddLineToPoint(path, NULL, 165 - offsetX, 23 - offsetY);
    CGPathAddLineToPoint(path, NULL, 176 - offsetX, 15 - offsetY);
    CGPathAddLineToPoint(path, NULL, 182 - offsetX, 26 - offsetY);
    CGPathAddLineToPoint(path, NULL, 190 - offsetX, 29 - offsetY);
    CGPathAddLineToPoint(path, NULL, 198 - offsetX, 31 - offsetY);
    CGPathAddLineToPoint(path, NULL, 203 - offsetX, 34 - offsetY);
    CGPathAddLineToPoint(path, NULL, 208 - offsetX, 37 - offsetY);
    CGPathAddLineToPoint(path, NULL, 213 - offsetX, 39 - offsetY);
    CGPathAddLineToPoint(path, NULL, 224 - offsetX, 36 - offsetY);
    CGPathAddLineToPoint(path, NULL, 226 - offsetX, 47 - offsetY);
    CGPathAddLineToPoint(path, NULL, 231 - offsetX, 51 - offsetY);
    CGPathAddLineToPoint(path, NULL, 236 - offsetX, 57 - offsetY);
    CGPathAddLineToPoint(path, NULL, 242 - offsetX, 61 - offsetY);
    CGPathAddLineToPoint(path, NULL, 245 - offsetX, 66 - offsetY);
    CGPathAddLineToPoint(path, NULL, 249 - offsetX, 72 - offsetY);
    CGPathAddLineToPoint(path, NULL, 262 - offsetX, 74 - offsetY);
    CGPathAddLineToPoint(path, NULL, 258 - offsetX, 86 - offsetY);
    CGPathAddLineToPoint(path, NULL, 264 - offsetX, 94 - offsetY);
    CGPathAddLineToPoint(path, NULL, 268 - offsetX, 101 - offsetY);
    CGPathAddLineToPoint(path, NULL, 270 - offsetX, 110 - offsetY);
    CGPathAddLineToPoint(path, NULL, 272 - offsetX, 117 - offsetY);
    CGPathAddLineToPoint(path, NULL, 283 - offsetX, 122 - offsetY);
    CGPathAddLineToPoint(path, NULL, 275 - offsetX, 132 - offsetY);
    CGPathAddLineToPoint(path, NULL, 276 - offsetX, 137 - offsetY);
    CGPathAddLineToPoint(path, NULL, 277 - offsetX, 145 - offsetY);
    CGPathAddLineToPoint(path, NULL, 277 - offsetX, 150 - offsetY);
    CGPathAddLineToPoint(path, NULL, 277 - offsetX, 156 - offsetY);
    CGPathAddLineToPoint(path, NULL, 276 - offsetX, 163 - offsetY);
    CGPathAddLineToPoint(path, NULL, 276 - offsetX, 167 - offsetY);
    CGPathAddLineToPoint(path, NULL, 283 - offsetX, 176 - offsetY);
    CGPathAddLineToPoint(path, NULL, 272 - offsetX, 183 - offsetY);
    CGPathAddLineToPoint(path, NULL, 271 - offsetX, 188 - offsetY);
    CGPathAddLineToPoint(path, NULL, 269 - offsetX, 195 - offsetY);
    CGPathAddLineToPoint(path, NULL, 266 - offsetX, 202 - offsetY);
    CGPathAddLineToPoint(path, NULL, 263 - offsetX, 208 - offsetY);
    CGPathAddLineToPoint(path, NULL, 260 - offsetX, 212 - offsetY);
    CGPathAddLineToPoint(path, NULL, 263 - offsetX, 225 - offsetY);
    CGPathAddLineToPoint(path, NULL, 250 - offsetX, 226 - offsetY);
    CGPathAddLineToPoint(path, NULL, 246 - offsetX, 233 - offsetY);
    CGPathAddLineToPoint(path, NULL, 241 - offsetX, 238 - offsetY);
    CGPathAddLineToPoint(path, NULL, 235 - offsetX, 243 - offsetY);
    CGPathAddLineToPoint(path, NULL, 229 - offsetX, 249 - offsetY);
    CGPathAddLineToPoint(path, NULL, 226 - offsetX, 250 - offsetY);
    CGPathAddLineToPoint(path, NULL, 225 - offsetX, 263 - offsetY);
    CGPathAddLineToPoint(path, NULL, 213 - offsetX, 259 - offsetY);
    CGPathAddLineToPoint(path, NULL, 207 - offsetX, 263 - offsetY);
    CGPathAddLineToPoint(path, NULL, 198 - offsetX, 267 - offsetY);
    CGPathAddLineToPoint(path, NULL, 191 - offsetX, 271 - offsetY);
    CGPathAddLineToPoint(path, NULL, 181 - offsetX, 273 - offsetY);
    CGPathAddLineToPoint(path, NULL, 175 - offsetX, 283 - offsetY);
    CGPathAddLineToPoint(path, NULL, 166 - offsetX, 275 - offsetY);
    CGPathAddLineToPoint(path, NULL, 159 - offsetX, 277 - offsetY);
    CGPathAddLineToPoint(path, NULL, 152 - offsetX, 277 - offsetY);
    CGPathAddLineToPoint(path, NULL, 145 - offsetX, 277 - offsetY);
    CGPathAddLineToPoint(path, NULL, 138 - offsetX, 277 - offsetY);
    CGPathAddLineToPoint(path, NULL, 133 - offsetX, 275 - offsetY);

    CGPathCloseSubpath(path);

    wheel.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
    wheel.physicsBody.allowsRotation = YES;
    wheel.physicsBody.linearDamping = 100;


    /*======================================================================*/


    /* "FLAPPER" CREATION */
    /*==============================================================================================*/
    flapper = [SKSpriteNode spriteNodeWithImageNamed:@"flapper.png"];
    flapper.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMaxY(self.frame) - 92);
    flapper.anchorPoint = CGPointMake(0.5, 1);
    flapper.physicsBody.allowsRotation = YES;
    CGFloat flapperOffsetX = flapper.frame.size.width * flapper.anchorPoint.x;
    CGFloat flapperOffsetY = flapper.frame.size.height * flapper.anchorPoint.y;

    CGMutablePathRef flapperPath = CGPathCreateMutable();

    CGPathMoveToPoint(flapperPath, NULL, 4 - flapperOffsetX, 0 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 5 - flapperOffsetX, 0 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 6 - flapperOffsetX, 2 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 7 - flapperOffsetX, 8 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 7 - flapperOffsetX, 13 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 7 - flapperOffsetX, 17 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 8 - flapperOffsetX, 21 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 8 - flapperOffsetX, 24 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 8 - flapperOffsetX, 29 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 8 - flapperOffsetX, 33 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 8 - flapperOffsetX, 37 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 8 - flapperOffsetX, 38 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 7 - flapperOffsetX, 40 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 6 - flapperOffsetX, 40 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 5 - flapperOffsetX, 40 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 3 - flapperOffsetX, 40 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 1 - flapperOffsetX, 39 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 1 - flapperOffsetX, 35 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 2 - flapperOffsetX, 15 - flapperOffsetY);
    CGPathAddLineToPoint(flapperPath, NULL, 3 - flapperOffsetX, 5 - flapperOffsetY
                         );

    CGPathCloseSubpath(flapperPath);

    flapper.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:flapperPath];
    flapper.physicsBody.mass = 5;
    flapper.physicsBody.linearDamping = 100;
    flapper.physicsBody.allowsRotation = TRUE;
    flapper.physicsBody.usesPreciseCollisionDetection = TRUE;

            /*==============================================================================================*/

        [self addChild:myLabel];
        [self addChild:wheel];
        [self addChild:flapper];
    }

    return self;
    }

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */

    for (UITouch *touch in touches)
    {

        CGPoint location = [touch locationInNode:self];

        //SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];

        SKAction *action = [SKAction rotateByAngle:10 duration:1];
        [wheel runAction:[SKAction repeatActionForever:action]];

        SKAction *slow = [SKAction speedBy:0.2 duration:5];
        [wheel runAction:[SKAction repeatAction:slow count:10]];
    }

    NSLog(@"reached end of touchesBegan");
}

person jpcguy89    schedule 02.06.2014    source източник


Отговори (3)


Стар въпрос, но за всеки, който гледа това с подобни въпроси. Създадох въртящо се колело с награди с отворен код в Spritekit и swift, което използва физика за реалистично движение и контрол на клапата.

Позволява на потребителя да генерира произволно завъртане чрез натискане на центъра на колелото или плъзгане на колелото, за да се завърти с помощта на физични сили.

https://github.com/hsilived/SpinWheel

въведете описание на изображението тук

person Ron Myschuk    schedule 11.04.2018

Мисля, че ще трябва да "фалшифицираш" клапата.

Създайте няколко клапи, които са огънати с различна степен и сменете правилната клапа за дадена позиция на колелото.

Няма причина клапата да взаимодейства физически с колелото — можете да забавите колелото с код. Всъщност, за толкова проста настройка изобщо няма нужда от физически код на тялото.

person JCalhoun    schedule 03.06.2014
comment
Хммм, как да го направя реалистично? Има ли начин да синхронизирате анимацията на клапата със скоростта на колелото? Освен това, имате ли представа защо не мога да завъртя колелото отново след първото завъртане? - person jpcguy89; 03.06.2014
comment
Също така, друга мисъл, не би ли било най-добре да ги накараме да си взаимодействат? В противен случай, как да предотвратя спирането на колелото на наградите в средна зона (известни още като колчетата, които разделят наградите и взаимодействат с флапера? - person jpcguy89; 03.06.2014

Вероятно би било по-хубаво, ако току-що сте направили спрайт за вашия флапер, където изображението може да бъде една от няколко (10 или повече) различни „извити“ позиции. тогава всичко, което ще трябва да направите, е да получите ъгъла на вашето колело и да го модифицирате според броя на кадрите, които имате, и да го умножите по Pi*2. Това трябва да работи добре. Надявам се, че това има смисъл.

Също така, това колело може да създаде един ред с CGPathAddArc вместо всички тези CGPathAddLineToPoint

що се отнася до въртенето, тъй като използвате комплект спрайтове, просто използвайте физическите неща, които получавате безплатно, вместо да използвате SKAction.

Има два случая, за които трябва да помислите. 1. когато потребителят плъзга около колелото, трябва да завъртите колелото, за да съответства на това движение незабавно (без анимация) 2. когато потребителят пусне, можете да изчислите скоростта, с която се е движил, като използвате предишната точка на докосването (част на докосването) и просто го превърнете в ъглова сила към вашето колело.

person Nathan    schedule 03.06.2014
comment
Всъщност имам колело за комплект спрайтове, което направих преди известно време и работи подобно на това. Ще видя дали мога да ти го намеря. но ето версия на UIView, за да започнете github.com/nathanfjohnson/SpinWheel - person Nathan; 03.06.2014
comment
Всъщност вече го намерих! Използвах го, докато търсех нещо, което отговаря на нуждите ми откъм функционалност. Ако намерите това колело Sprite Kit, моля, уведомете ме! - person jpcguy89; 10.06.2014