【问题标题】:How to animate SKNodes or SKSpriteNode to collide and bounce?如何为 SKNodes 或 SKSpriteNode 设置动画以碰撞和反弹?
【发布时间】:2014-11-19 15:38:32
【问题描述】:

我有几个关于动画 SKNode 和/或 SKSpriteNode 的问题。第一个是视图加载后如何让它们移动?我如何使它们相互碰撞并反弹并进入另一个方向。我为此使用了 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;

【问题讨论】:

    标签: objective-c xcode sprite-kit skspritenode skaction


    【解决方案1】:

    1) 代码中的第一个问题是两个静态物体永远不会发生碰撞,从而使它们成为动态物体。所以至少让一个或两个实体动态化。

    2)其次,对于线性运动,将 body.physicsBody.velocity 属性与动态物体结合使用。

    3) 更改您的位掩码类别 classicMode.physicsBody.categoryBitMask = classicCategory; classicMode.physicsBody.collisionBitMask = arcadeCategory; classicMode.physicsBody.contactTestBitMask = arcadeCategory;

    arcadeMode.physicsBody.categoryBitMask = arcadeCategory;
    

    请记住,当两个物体相互接触或碰撞时,在 spritekit 中使用了contactTestBitMask,并使用了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 中处理所有碰撞和碰撞逻辑

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多