发布
社区首页 >问答首页 >如何设置SKNodes或SKSpriteNode的动画以使其发生碰撞和反弹?

如何设置SKNodes或SKSpriteNode的动画以使其发生碰撞和反弹?
EN

Stack Overflow用户
提问于 2014-09-25 08:57:16
回答 1查看 356关注 0票数 0

我有几个关于SKNodes和/或SKSpriteNodes动画的问题。第一个问题是如何在视图加载后让它们移动?我如何让它们相互碰撞和反弹,然后走向另一个方向。为此,我使用了一个SKScene。另外,有没有一种方法可以用SKLabels对SKSriteNodes进行分组?

我有:

代码语言:javascript
代码运行次数:0
复制
 #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的地方

代码语言:javascript
代码运行次数:0
复制
    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];

另一个在这里

代码语言:javascript
代码运行次数:0
复制
    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];

冲突:

代码语言:javascript
代码运行次数:0
复制
    //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;

和碰撞检测:

代码语言:javascript
代码运行次数:0
复制
    //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;
EN

回答 1

Stack Overflow用户

发布于 2014-09-27 18:02:13

1)代码中的第一个问题是,两个静态实体永远不会发生冲突,从而使它们成为动态的。因此,至少使一个或两个身体为动力学。

2)其次,对于线性运动,对动态身体使用body.physicsBody.velocity属性。

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

代码语言:javascript
代码运行次数:0
复制
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中处理所有的冲突和冲突逻辑

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26028844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档