【问题标题】:SK Game - didBeginContact/didEndContact isn't getting calledSK Game - didBeginContact/didEndContact 没有被调用
【发布时间】:2014-09-03 23:49:00
【问题描述】:

我正在制作一个拖放游戏,并尝试使用physicsBodies 来检测1 个静态对象与用户拖动的对象之间的接触。

我在这里搜索了几个小时,并在线观看了教程,但我一直看到的是使用动态节点(例如射弹)进行接触检测。我不需要碰撞,因为当它们相交时任何节点都不会发生任何事情,我只需要接触检测来实现游戏逻辑。

我最初有一个使用 CGRectContainsPoint 和 CGRectContainsRect 的工作解决方案,但它有超级错误,在做了一些研究后,我意识到这不是在 SK 中实现接触/碰撞的正确方法。

我的 bitMask 设置如下:

//contact bit masks
typedef NS_OPTIONS(uint32_t, ContactCategory) {
    ContactCategoryTile     = 1 << 0,   //0000
    ContactCategoryKey      = 1 << 1,   //0010
    ContactCategoryRotor    = 1 << 2,   //0100
};

我选择的节点设置如下:

#import "TileNode.h"
#import "Utilities.h"

@interface TileNode ()

@end

@implementation TileNode

+(instancetype)tileNodeAtPosition:(CGPoint)position
                tileComboScore:(NSInteger)comboScore
                tileArray:(NSArray*)array
                randomNumber:(int)randomNumber
                initialCombo:(NSInteger)initCombo
{
    //custom node properties
    TileNode *tileNode = [array objectAtIndex:randomNumber];
    tileNode.position = position;
    tileNode.size = CGSizeMake(23, 63);

    //using label property from .h file and parenting to generated tileNode
    tileNode.comboLabel = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
    tileNode.comboLabel.fontColor = [UIColor whiteColor];
    tileNode.comboLabel.text = [NSString stringWithFormat: @"%d",initCombo];
    tileNode.comboLabel.fontSize = 12;
    tileNode.comboLabel.position = CGPointMake(13, 45);

    [tileNode setupPhysicsBody];
    [tileNode addChild:tileNode.comboLabel];

    return tileNode;
}

-(void)setupPhysicsBody
{
    self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size];
    NSLog(@"tileframe %@", NSStringFromCGRect(self.frame));
    self.physicsBody.dynamic = NO;
    self.physicsBody.categoryBitMask = ContactCategoryTile;
    self.physicsBody.contactTestBitMask = ContactCategoryTile | ContactCategoryRotor | ContactCategoryKey;
    self.physicsBody.collisionBitMask = 0;
}

我的目标节点类型设置如下:

#import "KeyNode.h"
#import "Utilities.h"

@implementation KeyNode

+(instancetype)keyNodeAtPosition:(CGPoint)position
{
    //custom class properties for generic yellow nodes in UI
    KeyNode *keyTile = [KeyNode spriteNodeWithImageNamed:@"key"];
    keyTile.position = position;
    keyTile.size = CGSizeMake(25, 65);
    keyTile.anchorPoint = CGPointMake(0.5, 0.5);
    keyTile.name = @"keyNode";

    [keyTile setupPhysicsBody];

    return keyTile;
}

-(void)setupPhysicsBody
{
    self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size];
    NSLog(@"keyframe %@", NSStringFromCGRect(self.frame));
    self.physicsBody.dynamic = NO;
    self.physicsBody.categoryBitMask = ContactCategoryKey;
    self.physicsBody.contactTestBitMask = ContactCategoryTile;
    self.physicsBody.collisionBitMask = 0;
}

我的接触检测委托方法如下:

-(void)didEndContact:(SKPhysicsContact *)contact
{
    NSLog(@"Working!");
    //Condition for tile and key contact
    if (contact.bodyA.categoryBitMask == ContactCategoryTile  && contact.bodyB.categoryBitMask == ContactCategoryKey)
    {
        NSLog(@"Tile contact with key");
    }
    //condition for tile and tile contact
    else if (contact.bodyA.categoryBitMask == ContactCategoryTile && contact.bodyB.categoryBitMask == ContactCategoryTile)
    {
        NSLog(@"Tile contact with tile");
    }
    //condition for tile and rotor contact
    else if(contact.bodyA.categoryBitMask == ContactCategoryTile && contact.bodyB.categoryBitMask == ContactCategoryRotor)
    {
        NSLog(@"Tile contact with rotor");
    }
}

两个节点都在 initWithSize 中被实例化,如下所示:

CGPoint position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 180);
TileNode *tileNode1 = [TileNode tileNodeAtPosition:position tileComboScore:self.comboScore tileArray:tileImagesArray randomNumber:randomTileGenerator initialCombo:self.initialCombo];
[self addChild:tileNode1];

KeyNode *keyNode1 = [KeyNode keyNodeAtPosition:CGPointMake(CGRectGetMidX(self.frame) - 100, CGRectGetMidY(self.frame) - 15)];
[self addChild:keyNode1];

任何帮助将不胜感激。

【问题讨论】:

  • 非动态实体不会产生接触事件

标签: ios sprite-kit collision-detection game-physics skphysicsbody


【解决方案1】:

我在去年的一个帖子中找到了答案。您可以解决希望静态物体发生碰撞的问题。

如果您将重力设置为不存在并使您的静态节点动态化,则它可以工作:

self.physicsWorld.gravity = CGVectorMake(0, 0);
self.physicsBody.dynamic = YES;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多