簡體   English   中英

如何測試2個SKSpriteNodes是否發生碰撞

[英]How to test if 2 SKSpriteNodes collide

嗨,我是IOS Dev的新手。 如果我的船體節點和fallingObject節點發生碰撞,我想發短信。 一旦發生碰撞,我想刪除該fallingObject節點。

在我的代碼中,我在場景中創建了一個籃子。 然后在屏幕上的隨機點上創建一個fallingObject節點。

我的目標是一旦fallingObject被船體(籃子節點內的假想框)碰撞(或捕獲)。 fallingObject會從場景中消失或移除。

請在下面查看我的代碼:

static const uint32_t boxCategory  = 0x1 << 0;
static const uint32_t fallingObjectCategory = 0x1 << 1;

#import "MyScene.h"

    - (SKSpriteNode *)newBasket
        {
            SKSpriteNode *basketImage = [[SKSpriteNode alloc] initWithImageNamed:@"basket-01.png"];
            basketImage.size = CGSizeMake(150,120);

            SKSpriteNode *hull = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(64,32)];
            [basketImage addChild:hull];

            hull.alpha = 0.0;
            hull.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:hull.size];
            hull.physicsBody.dynamic = NO;


            hull.physicsBody.categoryBitMask = boxCategory;
            hull.physicsBody.contactTestBitMask = fallingObjectCategory;
            hull.physicsBody.collisionBitMask = boxCategory | fallingObjectCategory;

            _basket = basketImage;
            _box =hull;

            return basketImage;
        }

        - (void)addFallingObject
        {

            SKSpriteNode *fallingObject = [[SKSpriteNode alloc] initWithImageNamed:[self getRandomFallingObject]];

            //Configure the Size
            switch (randomNumber) {
                case 0:
                    fallingObject.size = CGSizeMake(70,45);
                    break;
                case 1:
                    fallingObject.size = CGSizeMake(30,45);
                    break;
                case 2:
                    fallingObject.size = CGSizeMake(40,90);
                    break;
                default:
                    fallingObject.size = CGSizeMake(50,50);
                    break;
            }


            fallingObject.position = CGPointMake(skRand(0, self.size.width), self.size.height-50);
            fallingObject.name = @"fallingObject";
            fallingObject.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:fallingObject.size];
            self.physicsWorld.speed = 0.30;

           fallingObject.physicsBody.categoryBitMask = fallingObjectCategory;
           fallingObject.physicsBody.contactTestBitMask = boxCategory;
           fallingObject.physicsBody.collisionBitMask = fallingObjectCategory | boxCategory;

            [self addChild:fallingObject];

        }

-(void)didBeginContact:(SKPhysicsContact *)contact
{
    NSLog(@"contact detected");

    SKPhysicsBody *boxBody;
    SKPhysicsBody *fallingObjectBody;

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        boxBody = contact.bodyA;
        fallingObjectBody = contact.bodyB;
    }
    else
    {
        boxBody = contact.bodyB;
        fallingObjectBody = contact.bodyA;
    }

    if ((boxBody.categoryBitMask & boxCategory) !=0 && (fallingObjectBody.categoryBitMask & fallingObjectCategory) !=0)
    {
        //do whatever you want like remove a node
    }

}

謝謝你的幫助。 :d

我有一個精靈套件游戲,其中有兩件事發生沖突。 一個是玩家,一個是負責人。 在我編寫所有代碼之前,我都為此設置了一個類別。 這是在我所有進口和東西之前。

static const uint32_t playerCategory  = 0x1 << 4;
static const uint32_t chargeCategory = 0x1 << 5;

然后,當我制作每個節點時,請使用以下內容。

self.player.physicsBody.categoryBitMask = playerCategory;
self.player.physicsBody.contactTestBitMask = chargeCategory;
self.player.physicsBody.collisionBitMask = chargeCategory | selfCategory;

並負責。

_chargedBall.physicsBody.categoryBitMask = chargeCategory; 
_chargedBall.physicsBody.contactTestBitMask = playerCategory;
_chargedBall.physicsBody.collisionBitMask = playerCategory | selfCategory | chargeCategory;

這告訴玩家它可能會與沖鋒和我稱為“自我”的東西發生沖突,但是現在沒有必要。

然后在didBeginContact中使用。

SKPhysicsBody *playerBody, *chargeBody;

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
    playerBody = contact.bodyA;
    chargeBody = contact.bodyB;
}
else
{
    playerBody = contact.bodyB;
    chargeBody = contact.bodyA;
}

if ((playerBody.categoryBitMask & playerCategory) !=0 && (chargeBody.categoryBitMask & chargeCategory) !=0)
{  
  //do whatever you want like remove a node
}

編輯#1

我實際上是在initWithSize中創建對象。

-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size])
{   // a bunch of code

    self.player = [[Player alloc] initWithImageNamed:@"character"];
    self.player.name = @"MyPlayer";
    self.player.position = CGPointMake(self.frame.size.width / 2.0f, 120);
    self.player.zPosition = 15;
    self.player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.player.frame.size];
    self.player.physicsBody.dynamic = YES;
    self.player.physicsBody.affectedByGravity = NO;
    self.player.physicsBody.mass = 0.25;
    self.player.physicsBody.allowsRotation = NO;
    self.player.physicsBody.friction = 0.5;
    self.player.physicsBody.restitution = 0.3;
    self.player.physicsBody.categoryBitMask = playerCategory;
    self.player.physicsBody.contactTestBitMask = chargeCategory;
    self.player.physicsBody.collisionBitMask = chargeCategory | selfCategory;
    [self.map addChild:self.player];

 }

然后,我在方法中創建另一個obj。

- (void)spawnChargesWithNumber:(int)number
{   // some code
 _chargedBall.position = (CGPointMake(_randomX, random));
_chargedBall.name = [NSString stringWithFormat:@"chargeNumber%i", number];
_chargedBall.zPosition = 15;
_chargedBall.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:13.0f];
_chargedBall.physicsBody.dynamic = YES;
_chargedBall.physicsBody.affectedByGravity = NO;
_chargedBall.physicsBody.mass = 0.1;
_chargedBall.velocity = CGPointMake(0.0, 0.0); //changed actualVelocityX to 0
_chargedBall.physicsBody.categoryBitMask = chargeCategory;
_chargedBall.physicsBody.contactTestBitMask = playerCategory;
_chargedBall.physicsBody.collisionBitMask = playerCategory | selfCategory | chargeCategory;
[self.map addChild:_chargedBall];

}

編輯#2這可能會清除一些事情。 它來自Apple Docs。

*** categoryBitMask

定義此物理物體屬於哪個類別的蒙版。

@property(賦值,非原子)uint32_t categoryBitMask討論場景中的每個物理物體都可以分配多達32個不同的類別,每個類別對應於位掩碼中的一位。 您可以定義游戲中使用的遮罩值。 結合collisionBitMask和contactTestBitMask屬性,您可以定義哪些物理物體相互交互以及何時向您的游戲通知這些交互。

默認值為0xFFFFFFFF(所有位均置1)。

可用性在iOS 7.0和更高版本中可用。 另請參見在SKPhysicsBody.h中聲明的@propertyflictionBitMask @property contactTestBitMask

*** collisionBitMask

一個定義物理物體類別可以與該物理物體碰撞的蒙版。

@property(賦值,非原子)uint32_tflictionBitMask討論當兩個物理物體相互接觸時,可能會發生碰撞。 通過執行邏輯“與”運算,將該人體的防撞蒙版與其他人體的類別蒙版進行比較。 如果結果為非零值,則此主體受碰撞影響。 每個機構獨立選擇是否要受到另一個機構的影響。 例如,您可以使用它來避免碰撞計算,該碰撞計算對物體速度的變化可以忽略不計。

默認值為0xFFFFFFFF(所有位均置1)。

可用性在iOS 7.0和更高版本中可用。 另請參見在SKPhysicsBody.h中聲明的@property categoryBitMask

*** contactTestBitMask

定義哪些物體類別導致與此物理物體相交通知的蒙版。

@property(assign,nonatomic)uint32_t contactTestBitMask討論當兩個實體共享相同的空間時,通過執行邏輯AND操作,針對另一個實體的接觸掩碼測試每個實體的類別掩碼。 如果任何一個比較結果都為非零值,則將創建一個SKPhysicsContact對象,並將其傳遞給物理世界的委托。 為了獲得最佳性能,請僅在聯系人掩碼中設置您感興趣的交互的位。

默認值為0x00000000(清除所有位)。

可用性在iOS 7.0和更高版本中可用。 另請參見在SKPhysicsBody.h中聲明的@property categoryBitMask

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM