Как анимировать SKNodes или SKSpriteNode, чтобы они сталкивались и отскакивали?

У меня есть несколько вопросов относительно анимации SKNodes и/или SKSpriteNodes. Во-первых, как мне заставить их двигаться после загрузки представления? Как мне заставить их столкнуться и отскочить друг от друга и пойти в другом направлении. Я использую SKScene для этого. Также есть ли способ сгруппировать SKSriteNodes с SKLabels?

У меня есть:

 #import <SpriteKit/SpriteKit.h>

//constants for the collision bitmap
static const uint32_t classicCategory = 1 << 0;
static const uint32_t arcadeCategory = 1 << 1;
static const uint32_t frenzieCategory = 1 << 2;

@interface HomeScene : SKScene <SKPhysicsContactDelegate> {

BOOL isSoundActionCompleted;
}

@end

Здесь я объявляю SKSpriteNodes

    SKSpriteNode *classicMode = [SKSpriteNode spriteNodeWithImageNamed:@"bubble.png"];
    classicMode.size = CGSizeMake(130, 130);
    classicMode.position = CGPointMake(self.size.width/2, self.size.height/2+50);
    classicMode.name = @"classicMode";
    [self addChild:classicMode];

    SKLabelNode *classicTitle = [SKLabelNode labelNodeWithFontNamed:@"Noteworthy"];
    classicTitle.text = @"Classic";
    classicTitle.fontSize = 25;
    classicTitle.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeCenter;
    classicTitle.verticalAlignmentMode = SKLabelVerticalAlignmentModeCenter;
    classicTitle.fontColor = [SKColor darkGrayColor];
    classicTitle.position = CGPointMake(self.size.width/2, self.size.height/2+50);
    classicTitle.name = @"classicTitle";
    [self addChild:classicTitle];

Другой здесь

    SKSpriteNode *arcadeMode = [SKSpriteNode spriteNodeWithImageNamed:@"bubble.png"];
    arcadeMode.size = CGSizeMake(130, 130);
    arcadeMode.position = CGPointMake(self.size.width/2+68, self.size.height/2-65);
    arcadeMode.name = @"arcadeMode";
    [self addChild:arcadeMode];

    SKLabelNode *arcadeTitle = [SKLabelNode labelNodeWithFontNamed:@"Noteworthy"];
    arcadeTitle.text = @"Arcade";
    arcadeTitle.fontSize = 25;
    arcadeTitle.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeCenter;
    arcadeTitle.verticalAlignmentMode = SKLabelVerticalAlignmentModeCenter;
    arcadeTitle.fontColor = [SKColor darkGrayColor];
    arcadeTitle.position = CGPointMake(self.size.width/2+68, self.size.height/2-65);
    arcadeTitle.name = @"arcadeTitle";
    [self addChild:arcadeTitle];

Столкновение:

    //collision  and contact detection
    self.physicsBody.categoryBitMask = arcadeCategory;

    //physics and collision detection
    classicMode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:classicMode.size];
    classicMode.physicsBody.dynamic = NO;  //no gravity
    classicMode.physicsBody.categoryBitMask = arcadeCategory;

    arcadeMode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:arcadeMode.size];
    arcadeMode.physicsBody.dynamic = NO;  //no gravity
    arcadeMode.physicsBody.categoryBitMask = classicCategory;

И обнаружение столкновений:

    //collision detection
    classicMode.physicsBody.categoryBitMask = classicCategory;
    classicMode.physicsBody.collisionBitMask = arcadeCategory;
    classicMode.physicsBody.contactTestBitMask = arcadeCategory;

    arcadeMode.physicsBody.categoryBitMask = arcadeCategory;
    arcadeMode.physicsBody.collisionBitMask = classicCategory;
    arcadeMode.physicsBody.contactTestBitMask = classicCategory;

person Ed3121577    schedule 25.09.2014    source источник


Ответы (1)


1) первая проблема в вашем коде заключается в том, что два статических тела никогда не сталкиваются, что делает их динамическими. поэтому сделайте хотя бы одно или оба тела динамическими.

2) во-вторых, для линейного движения используйте свойство body.physicsBody.velocity с телами динамических тел.

3) измените категории битовой маски classicMode.physicsBody.categoryBitMask = classicCategory; classicMode.physicsBody.collisionBitMask = arcadeCategory; classicMode.physicsBody.contactTestBitMask = arcadeCategory;

arcadeMode.physicsBody.categoryBitMask = arcadeCategory;

помните, что contactTestBitMask используется в spritekit, когда два тела соприкасаются или сталкиваются друг с другом, а CollisionBitMask используется для предотвращения их перекрытия или прохождения друг через друга

я вырезал arcadeMode.physicsBody.collisionBitMask = classicCategory; arcadeMode.physicsBody.contactTestBitMask = classicCategory; из вашего кода, потому что вы уже определили его в classicMode.physicsBody.categoryBitMask = classicCategory; classicMode.physicsBody.collisionBitMask = arcadeCategory; classicMode.physicsBody.contactTestBitMask = arcadeCategory; так что не надо переделывать

используйте contactTestBitMask и CollisionBitMask только один раз, когда вы хотите, чтобы две категории взаимодействовали друг с другом

4) обрабатывать всю вашу логику столкновений и столкновений внутри didbegincontact и didEndContact

person dragoneye    schedule 27.09.2014